hdu 1358 Period

来源:互联网 发布:sybase查看数据库空间 编辑:程序博客网 时间:2024/04/29 11:25

next数组的应用题。

对于next[i] ,i代表长度,i-next[i]代表最开始可分割的长度,如果i%(i-next[i])为0且 i/(i-next[i])>1 则代表能分出长度为i-next[i]的i/(i-next[i]) 个部分!i

#include"cstdio"#include"cstring"#include"cmath"#include"cstdlib"#include"iostream"#include"algorithm"#include"queue"using namespace std;char a[1000002];int next[1000002],n;void getnext(char *t){    int i,j;    i=0;    j=-1;    next[0]=-1;    while(t[i])    {        if(j==-1||t[i]==t[j])  next[++i]=++j;        else j=next[j];    }}int main(){    int cas=1;    while(scanf("%d",&n),n)    {        scanf("%s",a);        getnext(a);        printf("Test case #%d\n",cas++);        for(int i=0;i<=n;i++)        {            if(next[i]==0) continue;            if(i%(i-next[i])==0&&i/(i-next[i])>0)            {                printf("%d %d\n",i,i/(i-next[i]));            }        }        puts("");    }}

0 0