|poj 2406|KMP|Power Strings

来源:互联网 发布:超级sql注入工具下载 编辑:程序博客网 时间:2024/05/18 03:48

poj传送门
可以知道,在一个字符串里的最短周期是ms=nf[i], 其中f是kmp中的失配函数。
如果ms|n, 那么输出n/ms, 否则输出1.

#include<cstdio>    #include<algorithm>    #include<cstring>     #define ms(i,j) memset(i,j, sizeof i);    using namespace std;const int MAXN = 1000000 + 5;int n;char s[MAXN];int f[MAXN];int main()   {         while (scanf("%s", s)&&(s[0]!='.'))    {        n = strlen(s);        f[0] = f[1] = 0;        for (int i=1;i<n;i++)        {            int j = f[i];            while (j && s[i]!=s[j]) j = f[j];            f[i+1] = (s[i]==s[j]) ? (j+1) : (0);        }        int ans = n-f[n];        if (n%ans==0) ans = n/ans; else ans = 1;        printf("%d\n", ans);    }    return 0;    }    
0 0
原创粉丝点击