首页 > 其他 > 详细

「SNOI2019」字符串

时间:2019-10-13 21:36:13      阅读:82      评论:0      收藏:0      [点我收藏+]

题目链接:Click here

Solution

事实上,我们发现我们比较的两个字符串是极为相似的

设我们当前要比较的两个字符串为\(s_x\)\(s_y\),而他们不同的地方就在于原串\(x\sim y\)的部分

而这一部分也是十分相似的,准确的来说,他们对应的位置在原串中事实上是位置相邻的点

则我们只需要记录每个点后第一个相邻位置值不同的位置,再魔改一下\(cmp\)就行了

Code:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+11;
char s[N];
int n,nxt[N],p[N];
inline bool cmp(int x,int y){
    int v=nxt[min(x,y)];
    if(v<max(x,y)){
        if(x<y) return s[v+1]<s[v];
        else return s[v]<s[v+1];
    }else return x<y;
}
int read(){
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
    while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
signed main(){
    n=read();
    scanf("%s",s+1);nxt[n]=n;
    for(int i=n-1;i;i--){
        if(s[i]!=s[i+1]) nxt[i]=i;
        else nxt[i]=nxt[i+1];
    }
    for(int i=1;i<=n;i++) p[i]=i;
    sort(p+1,p+n+1,cmp);
    for(int i=1;i<=n;i++) printf("%d ",p[i]);
    return 0;
}

「SNOI2019」字符串

原文:https://www.cnblogs.com/NLDQY/p/11668261.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!