poj 2406 && 1961
要说用到KMP算法,觉得也就是用到KMP的一个模板,主要还是用了KMP求出next 之后怎么判断才是关键,这两道题目是一个做法,就是最后输出稍有不同
poj2406:以前在哈工大那个ACM基础教程上做过这个题目,这次做训练计划又敲了一遍,至于思路,贴个链接吧,就不重复说了http://www.cnblogs.com/fxh19911107/archive/2011/12/02/2271865.html
poj 1961:http://poj.org/problem?id=1961
题意:不知道怎么表达,还是拿第二个例子来说吧
aabaabaabaab 这 从第一个 到 第二个 a 重复了 2 次,所以输出就是 2 2,到第六个位置时,aab这个子串在 aabaab里重复出现了 2 次,所以输出是 6 2,然后到第九个位置 aab 在aabaabaab里面重复出现了 3 次,所以输出是 9 3 ,然后最后输出的就是 12 4 了
View Code
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 #define N 1000010 6 #define _clr(a,val) (memset(a,val,sizeof(a))) 7 8 using namespace std; 9 10 int next[N]; 11 char str[N]; 12 void getnext(int n) 13 { 14 int i = 0; 15 int j = -1; 16 next[0] = -1; 17 while(i <= n) 18 { 19 if(j == -1 || str[i] == str[j]) 20 { 21 i++, j++; 22 next[i] = j; 23 } 24 else j = next[j]; 25 } 26 } 27 int main() 28 { 29 int n,i; 30 int cs = 0; 31 //freopen("data.txt","r",stdin); 32 while(scanf("%d",&n),n) 33 { 34 getchar(); 35 cin.getline(str,N); 36 getnext(n); 37 printf("Test case #%d\n",++cs); 38 for(i = 2; i <= n; i++) 39 { 40 int tem = i - next[i]; // 重复子串的长度 41 int kem = i / tem; // 重复次数 42 if(i % tem == 0 && kem > 1) // 如果 现在的长度 % 重复子串长度为零,并且次数大于 1 那么就是可以输出的结果 43 { 44 printf("%d %d\n",i,kem); 45 } 46 } 47 printf("\n"); 48 } 49 return 0; 50 }