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");}}}
阅读全文
0 0
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- 第一个java程序
- 冒泡排序
- linux命令
- Construct2:自制简易超级玛丽射击游戏
- 计算机网络---------对隧道技术的皮毛理解
- POJ
- 201312-2 ISBN号码 ccf
- 编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
- Andrew NG 机器学习 练习5-Regularized Linear Regression and Bias/Variance
- 获取最新SVN插件
- 一个无序自然数数列,给定一个数M,选取自然数数列中两个数,其中他们的和是M,打印所有这样的自然数对
- win8远程桌面多开
- console
- 数据结构实验之栈与队列十:走迷宫