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 }
posted @ 2012-08-05 21:21  AC_Girl  阅读(169)  评论(0编辑  收藏  举报