poj 2406 Power Strings KMP应用
来源:互联网 发布:java 多泛型的 编辑:程序博客网 时间:2024/06/03 06:58
Power Strings
Time Limit: 3000MS Memory Limit: 65536KTotal Submissions: 27694 Accepted: 11600
Description
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).
Input
Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.
Output
For each s you should print the largest n such that s = a^n for some string a.
Sample Input
abcdaaaaababab.
Sample Output
143
Hint
This problem has huge input, use scanf instead of cin to avoid time limit exceed.
Source
Waterloo local 2002.07.01
如果len%(len-next[len-1])==0,则 字符串中必存在最小循环节,且循环次数 即为 len/(len-next[len-1])
证明:
必要性:因为字符串中存在最小循环节 (设长度为k),next[len-1]=len-k,所以len%(lennext[len-1])==0;
充分性:令k1=len-next[len-1],由于k1整除len, 所以可以相应的把len划分为n片区域 (n=len/(k1)),从小到大依次表示为 • t1,t2...tn;由next数组的定义可知, t1=t2,t2=t3,...t(n-1)=tn,且相应的片区域即为最 小,所以循环次数也为len/(len-next[len-1]);
#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int nMax=1000005;const int mMax=1000005;char text[mMax],pat[nMax];int lent,lenp,next[nMax];void get_next(){ int i,j=0; next[0]=-1; for(i=1; i<lenp; i++) { j=next[i-1]; while(j&&pat[j]!=pat[i]) j=next[j-1]; if(pat[j]==pat[i]) { next[i]=j+1; } else next[i]=0; }}//int KMP()//{// int ans=0,i=0,j=-1;// get_next();// for(i=0; i<lent; i++)// {// while(j!=-1&&pat[j+1]!=text[i])// {// j=next[j];// }// if(pat[j+1]==text[i])j=j+1;// if(j==lenp-1)ans++; //找到一个匹配// }// return ans;//}int main(){ int t;// scanf("%d",&t); while(scanf("%s",pat)&&pat[0]!='.') { lenp=strlen(pat);// lent=strlen(text);// printf("%d\n",KMP()); get_next();//for(int i=1;i<5;i++)// cout<<next[i]<< " "; if(lenp%(lenp-next[lenp-1])==0) { printf("%d\n",lenp/(lenp-next[lenp-1])); } else printf("1\n"); } return 0;}
- POJ 2406 Power Strings(KMP的应用)
- poj 2406 Power Strings KMP应用
- poj 2406 Power Strings 【KMP的应用】
- poj 2406 Power Strings---kmp
- POJ 2406 Power Strings KMP
- poj-2406-Power Strings-kmp
- POJ-2406 Power Strings KMP
- Power Strings - POJ 2406 KMP
- poj 2406 Power Strings kmp
- POJ 2406-Power Strings (KMP)
- 【KMP】 POJ 2406 Power Strings
- poj 2406 Power Strings KMP
- POJ 2406 Power Strings KMP
- poj 2406 Power Strings KMP
- poj 2406 Power Strings (KMP)
- [2406]Power Strings (POJ) KMP
- Power Strings (poj 2406 KMP)
- poj 2406 Power Strings【KMP】
- C# for Android
- JAVA多线程
- webservice生成客户端两种方式
- Deep Learning(深度学习)学习笔记整理系列之(四)
- linux下的tomcat配置多域名网站
- poj 2406 Power Strings KMP应用
- svn中添加不想被提交的文件到ignore列表中
- 用ATL建立轻量级的COM对象(五)
- 对使用包(Package)的忠告
- Java设计模式笔记之代理模式
- ajax的同步与异步
- UIWebView显示PDF文件
- Java 访问权限修饰词(access specifier)
- 文档清单