POJ1961 Period

本文分享了一种使用KMP算法求字符串循环节的方法,并提供了一份详细的C++代码实现。通过对输入字符串进行预处理,计算出部分匹配表,进而找出所有可能的循环节及其长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同UVa 1328

http://www.cnblogs.com/SilverNebula/p/5550595.html

写一半才想起来这题以前做过……

 

kmp求循环节

 1 /*by SilverN*/
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 using namespace std;
 8 const int mxn=1000200;
 9 char s[mxn];
10 int next[mxn];
11 int n;
12 int main(){
13     int i,j;
14     int cas=0;
15     while(scanf("%d",&n) && n){
16         printf("Test case #%d\n",++cas);
17         scanf("%s",&s);
18         next[0]=0;
19         next[1]=0;
20         j=0;
21         for(i=1;i<n;i++){
22             j=next[i];
23             while(s[j]!=s[i] && j)j=next[j];
24             if(s[j]==s[i])j++;
25             next[i+1]=j;
26         }
27         for(i=2;i<=n;i++){
28             if(next[i] && i%(i-next[i])==0)
29                 printf("%d %d\n",i,i/(i-next[i]));
30         }
31         printf("\n");
32     }
33     return 0;
34 }

 

转载于:https://www.cnblogs.com/SilverNebula/p/5853454.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值