【hdu 3746】 Cyclic Nacklace KMP求循环节

来源:互联网 发布:淘宝客qq群推广教程 编辑:程序博客网 时间:2024/05/16 17:24

考虑循环节的产生,产生一个循环节,一定是后面的f数组单调递增,全部可以完全匹配。所以总长度减去递增的长度就是循环节的长度。


#include <bits/stdc++.h>using namespace std;char ch[100010];int f[100010];int main(){int t;scanf("%d", &t);while(t --){scanf("%s", ch+1);int len = strlen(ch+1);for(int i = 1; i <= len; i ++) f[i] = 0;int p = 0;for(int i = 2; i <= len; i ++){while(p > 0 && ch[p+1] != ch[i]) p = f[p];if(ch[p+1] == ch[i]) p ++;f[i] = p;}int now = len - f[len];if(now == len) printf("%d\n", len);else if(!(len%now)) printf("0\n");else printf("%d\n", now-(len%now));}return 0;}


0 0
原创粉丝点击