String Problem HDU - 3374

最大最小表示法

直接上模板,然后求一个最小循环节就好了

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int max_n = 1e6+100;
int getminstring(char s[]){
    int nn = strlen(s);
    int i=0,j=1,k=0;
    while (i<nn&&j<nn&&k<nn){
        if (s[(i+k)%nn]==s[(j+k)%nn])++k;
        else if (s[(i+k)%nn]>s[(j+k)%nn])i=i+k+1,k=0;
        else if (s[(i+k)%nn]<s[(j+k)%nn])j=j+k+1,k=0;
        if (i==j)++j;
    }return min(i,j);
}
int getmaxstring(char s[]){
    int nn = strlen(s);
    int i=0,j=1,k=0;
    while (i<nn&&j<nn&&k<nn){
        if (s[(i+k)%nn]==s[(j+k)%nn])++k;
        else if (s[(i+k)%nn]<s[(j+k)%nn])i=i+k+1,k=0;
        else if (s[(i+k)%nn]>s[(j+k)%nn])j=j+k+1,k=0;
        if (i==j)++j;
    }return min(i,j);
}
int net[max_n];
void getnext(char p[]){
    int nn=strlen(p);
    net[0]=-1;
    for (int i=0,j=-1;i<nn;){
        if (j==-1||p[i]==p[j])net[++i]=++j;
        else j=net[j];
    }
} 
char s[max_n];
int main(){
    while (~scanf("%s",s)){
        getnext(s);int n = strlen(s);
        int mi=getminstring(s);
        int ma=getmaxstring(s);
        int cyc = n-net[n];
        int cycnum = 1;
        if (cyc>0&&n%cyc==0)cycnum=n/cyc;
        printf("%d %d %d %d\n",mi+1,cycnum,ma+1,cycnum);
    }
}
Kuangbin题单详解(kmpManacher) 文章被收录于专栏

刷Kuangbin题

全部评论

相关推荐

01-24 08:13
已编辑
合肥工业大学 Java
程序员牛肉:没啥问题。标准的流水线简历,但是学历好一点,所以应该是有约面的机会的。 这段时间可以考虑把自己的两个项目彻底的理一理。争取能够讲清楚每一个功能点
点赞 评论 收藏
分享
2024-12-27 13:08
华南理工大学 Java
蝴蝶飞出了潜水钟丿:多看一眼就会💥
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务