标签:des style blog http java color
Time Limit: 3000 MS Memory Limit: 65536 KB
64-bit integer IO format: %I64d , %I64u Java class name: Main
abcd aaaa ababab .
1 4 3
题意:求解最多重复子串
利用KMP的前缀数组 以p为模式串 next【i】的意思 为前个字符组成的子串为s 则s的前next【i】个字符与后next【i】个字符相等
注意 : len(p)-next【len(p))】==循环节的长度
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int next[1000002]; char p[1000002]; void find(char p[]) { int m=strlen(p+1); next[1]=0; for(int k=0,q=2; q<=m; q++) { while(k>0&&p[k+1]!=p[q]) k=next[k]; if(p[k+1]==p[q]) k++; next[q]=k; } } int main() { while(~scanf("%s",p+1)) { if(!strcmp(".",p+1)) break; find(p); int len=strlen(p+1); int len1=len-next[len]; printf("%d\n",len%len1?1:len/len1); } }
Time Limit: 3000 MS Memory Limit: 30000 KB
64-bit integer IO format: %I64d , %I64u Java class name: Main
3 aaa 12 aabaabaabaab 0
Test case #1 2 2 3 3 Test case #2 2 2 6 2 9 3 12 4
题意: 定义字符串A,若A最多由n个相同字串s连接而成,则A=s^n,如"aaa" = "a"^3,"abab" = "ab"^2 "ababa" = "ababa"^1 给出一个字符串A,求该字符串的所有前缀中有多少个前缀SA= s^n(n>1) 输出符合条件的前缀长度及其对应的n
如aaa 前缀aa的长度为2,由2个‘a‘组成 前缀aaa的长度为3,由3个"a"组成
分析:KMP
若某一长度L的前缀符合上诉条件,则
1.next[L]!=0(next[L]=0时字串为原串,不符合条件)
2.L%(L-next[L])==0(此时字串的长度为L/next[L])
对于2:有str[0]....str[next[L]-1]=str[L-next[L]-1]...str[L-1]
=》str[L-next[L]-1] = str[L-next[L]-1+L-next[L]-1] = str[2*(L-next[L]-1)];
假设S = L-next[L]-1;则有str[0]=str[s]=str[2*s]=str[3*s]...str[k*s],对于所有i%s==0,均有s[i]=s[0]
同理,str[1]=str[s+1]=str[2*s+1]....
str[j]=str[s+j]=str[2*s+j]....
综上,若L%S==0,则可得L为str[0]...str[s-1]的相同字串组成,
总长度为L,其中字串长度SL = s-0+1=L-next[L],循环次数为L/SL
故对于所有大于1的前缀,只要其符合上述条件,即为答案之一
#include "stdio.h" int p[1000010],N; char str[1000010]; void get_p(int n) { int i,j=-1; p[0]=-1; for(i=1;i<n;i++) { while(j>-1 && str[i]!=str[j+1]) j=p[j]; if(str[i] == str[j+1]) j++; p[i]=j; } } int main() { int i,j,cas=1; while(scanf("%d",&N),N) { scanf("%s",str); get_p(N); printf("Test case #%d\n",cas++); for(i=1;i<N;i++) { if(p[i]!=-1 && (i+1)%(i-p[i])==0) printf("%d %d\n",i+1,(i+1)/(i-p[i])); } printf("\n"); } }
http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html 看一看
poj 2046&&poj1961KMP 前缀数组,布布扣,bubuko.com
标签:des style blog http java color
原文地址:http://www.cnblogs.com/zhangying/p/3856001.html