POJ

来源:互联网 发布:买刷枪软件 编辑:程序博客网 时间:2024/05/14 09:05

KMP进阶


求循环节出现次数(对整串来说) 不存在能覆盖全串的循环节的话 是 1

如果存在的话在超出串的

第一个位置的前匹配点就是上个循环节结束的位置


#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<cmath>#include<set>#include<queue>#include<stack>#include<map>#define PI acos(-1.0)#define in freopen("in.txt", "r", stdin)#define out freopen("out.txt", "w", stdout)using namespace std;typedef long long ll;typedef unsigned long long ull;const int maxn = 1e7 + 7, maxd = 1e4 + 7, mod = 1e9 + 7;const ll INF = 0x7f7f7f7f;int len, ans;char s[maxn];int f[maxn];void init() {    f[0] = f[1] = 0;    for(int i = 1; i < len; ++i) {        int j = f[i];        while( j && s[i] != s[j]) j = f[j];        f[i+1] = (s[i] == s[j] ? j+1 : 0);    }//    for(int i = 0; i <= len; ++i)//        cout << f[i] << " ";}int main() {    while(~scanf("%s", s) && s[0] != '.') {        len = strlen(s);        init();        if(len % (len-f[len]) == 0)            printf("%d\n", len / (len-f[len]));        else puts("1");    }    return 0;}


原创粉丝点击