String Problem HDU - 3374

http://acm.hdu.edu.cn/showproblem.php?pid=3374

详解https://wenku.baidu.com/view/b0ef1be7a6c30c2258019ede.html

字符串最大最小表示法 求出起始位置

#include <bits/stdc++.h>
using namespace std;

int go[1000010];
int n;
char ch[1000010];

void kmp()
{
    int i,j;
    go[0]=-1;
    i=0,j=-1;
    while(i<n)
    {
        if(j==-1||ch[i]==ch[j])
        {
            i++,j++;
            go[i]=j;
        }
        else j=go[j];
    }
    return;
}

int getmm(int flag)//0最小 1最大
{
    int i,j,k,t;
    i=0,j=1,k=0;
    while(i<n&&j<n&&k<n)
    {
        t=ch[(i+k)%n]-ch[(j+k)%n];
        if(!t) k++;
        else
        {
            if(flag)
            {
               if(t>0) j+=(k+1);
               else i+=(k+1);
            }
            else
            {
                if(t>0) i+=(k+1);
                else j+=(k+1);
            }
            if(i==j) j++;
            k=0;
        }
    }
    return min(i,j)+1;
}

int main()
{
    int i,minn,maxx,l;
    while(scanf("%s",ch)!=EOF)
    {
        n=strlen(ch);
        kmp();
        minn=getmm(0);
        maxx=getmm(1);
        if(n%(n-go[n])==0) l=n/(n-go[n]);
        else l=1;
        printf("%d %d %d %d\n",minn,l,maxx,l);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sunyutian1998/article/details/82960189
今日推荐