hdu3746(kmp最小循环节)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746
题意:问在一个字符串末尾加上多少个字符能使得这的字符串首尾相连后能够循环
题解:就是利用next的性质求最小循环节
kmp求最下循环节http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html
ans=len-next[len];ans就是最小循环节长度证明看那个博客。
然后就简单了。
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int M = 1e5 + 10; char s[M]; int Next[M]; void getnext() { int i = 0 , j = -1; int len = strlen(s); Next[0] = -1; while(i < len) { while(j != -1 && s[i] != s[j]) j = Next[j]; Next[++i] = ++j; } } int main() { int n; scanf("%d" , &n); while(n--) { scanf("%s" , s); memset(Next , 0 , sizeof(Next)); getnext(); int ans = 0; int len = strlen(s); ans = len - Next[len]; if(ans != len && len % ans == 0) { printf("0\n"); } else { printf("%d\n" , ans - (len - len / ans * ans)); } } return 0; }