POJ

来源:互联网 发布:男士面霜 知乎 编辑:程序博客网 时间:2024/06/04 17:57

https://cn.vjudge.net/contest/189927#problem/D



题意: 就是问你字符串的最小循环然后输出最大的循环次数。

思路: 同样也是nex数组的应用,我们都知道当一个串是循环串的话,此时我们设这个串长度为s,循环节长度为k,那么根据nex数组的定义我们知道除了他本身,最长的公共前后缀就是nex[len],他的长度是s-k,为什么,因为最长前后缀是这个串本身对吧,那么除了他本身最长的公共前后缀就是减去一个循环节长度,也就是nex[len],那么我们单个的循环节k = len -nex[len];那么现在我们知道最小的循环节长度了,那我们现在要做的就是看字符串的长度S能不能整除k如果可以就表明他有循环节

上代码把:

#include <cstdio>#include <cstring>char ch[1999999];int nex[1999999];void pre_kmp(){int len = strlen(ch) , k = -1 , i = 0;nex[0] = -1;while(i < len){if(k == -1 ||ch[i] == ch[k]){k++,i++;nex[i]=k;}else k=nex[k];}}int main(){while(scanf("%s",ch)!=EOF){if(ch[0] == '.') break;pre_kmp();int len = strlen(ch);if(len % (len - nex[len])==0){printf("%d\n",len/(len - nex[len]));}else {puts("1");}}}


原创粉丝点击