poj1961Period【kmp next数组】

大意:跟poj2406一样的题  思路见http://www.cnblogs.com/zhanzhao/p/4761477.html

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 
 6 const int maxn = 1000005;
 7 
 8 int next[maxn];
 9 
10 void get(char *s) {
11     int l = strlen(s);
12     int j = 0, k = -1;
13     next[0] = -1;
14     while(j < l) {
15         if(k == -1 || s[j] == s[k]) {
16             
17 
18 
19 //            if(s[++j] == s[++k]) {
20 //                next[j] = next[k];
21 //            } else {
22 //                next[j] = k;
23 //            }
24             next[++j] = ++k;
25         } else {
26             k = next[k];
27         }
28     }
29 }
30 char s[maxn];
31 
32 int main() {
33     int n;
34     int kase = 1;
35     while(scanf("%d",&n) && n) {
36         scanf("%s",s);
37         printf("Test case #%d\n", kase++);
38         get(s);
39         int l = strlen(s);
40 //        for(int i = 0; i <= l; i++) {
41 //            printf("%d ", next[i]);
42 //        }puts("");
43         for(int i = 2; i <= l; i++) {
44             int ans = 1;
45             if(i % (i - next[i]) == 0) {
46                 ans = i / (i - next[i]);
47             }
48             if(ans > 1) {
49                 printf("%d %d\n", i, ans);
50             }
51         }
52         puts("");
53     }
54 }
View Code

 

转载于:https://www.cnblogs.com/zhanzhao/p/4761549.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值