2018牛客多校第三场 E Sort String (最小循环节)

题目

思路:模拟几个字符串就会发现规律,跟最小循环节有关。只要用Next数组找到最小循环节就可以了。

代码:

#include<stdio.h>
#include<string.h>
using namespace std;
const int N=1e6+10;
char c[N];
int Next[N];
void init(int n)
{
    int i=0,j=-1;
    while(i<n)
    {
        if(j==-1||c[i]==c[j])
        {
            i++;
            j++;
            Next[i]=j;
        }
        else
        {
            j=Next[j];
        }
    }
}
int main()
{
    while(~scanf("%s",c))
    {
        memset(Next,0,sizeof(Next));
        Next[0]=-1;
        int len=strlen(c);
        init(len);
        printf("%d\n",len-Next[len]);
        for(int i=0;i<len-Next[len];i++)
        {
            printf("%d %d",len/(len-Next[len]),i);
            int k=i;
            for(int j=1;j<len/(len-Next[len]);j++)
            {
                k+=len-Next[len];
                printf(" %d",k);
            }
            printf("\n");
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/imzxww/article/details/81233793