首页 > 代码库 > [KMP]HDU1358 Period

[KMP]HDU1358 Period

题目链接

思考

题目就是利用KMP的失配数组来找循环串.具体看代码注释

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int nexta[1000002];char s[1000002];int n;//失配数组 void getnexta(){    memset(nexta,0,sizeof(nexta));    int k = -1,j = 0;    nexta[0] = -1;    while(j < n )    {        if(k == -1 || s[k] == s[j])        {            nexta[j + 1] = k + 1;            j ++;            k ++;        }        else        {            k = nexta[k];        }    }}int main(){        int t = 0,temp;        while(1)        {            t ++;            scanf("%d",&n);            if(n == 0)                break;            scanf("%s",s);            printf("Test case #%d\n",t);            getnexta();            for(int i = 1; i <= n; i ++) //从1开始循环的原因是 nexta[0]必然是0             {                if(nexta[i] == 0)                {                    continue;                }                else                {                    //这里是主要                     temp = i - nexta[i] ;//循环小节的长度                    if( i  % temp == 0 && i  / temp  > 1)//这是由于nexta[i]表示的是i-1                        printf("%d %d\n",i ,i  / temp);                }            }        printf("\n");        }        return 0;}

 

最后吐槽下我之前用KMP模板,之前的那个模板失配数组有毛病。

aaa这种串的失配数组是 0 0 1 大写的服!

[KMP]HDU1358 Period