# LA 3026(Period-MP算法)[Template:KMP]

### 3026 – Period

Time limit: 3.000 seconds

For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the prefix is a periodic string. That is, for each i (2 ≤ i ≤ N) we want to know the largest K > 1 (if there is
one) such that the prefix of S with length i can be written as AK , that is A concatenated K times, for some string A. Of course, we also want to know the period K.

## Input

The input file consists of several test cases. Each test case consists of two lines. The first one contains N (2 ≤ N ≤ 1 000 000) the size of the string S. The second line contains the string S. The input file ends with a line, having the number zero on
it.

## Output

For each test case, output ‘Test case #’ and the consecutive test case number on a single line; then, for each prefix with length i that has a period K > 1, output the prefix size i and the period K separated by a single space; the prefix sizes
must be in increasing order. Print a blank line after each test case.

```3
aaa
12
aabaabaabaab
0
```

## Sample Output

```Test case #1
2 2
3 3

Test case #2
2 2
6 2
9 3
12 4
```

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i–)
#define RepD(i,n) for(int i=n;i>=0;i–)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define MAXN (1000000+10)
typedef long long ll;
ll mul(ll a,ll b){return (a*b)%F;}
ll sub(ll a,ll b){return (a-b+(a-b)/F*F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
// kmp
class KMP
{
public:
int f2[MAXN]; //字符串从0开始，但是f[i]表示匹配第i个字符，前面留1个 f[0]–a–>f[1]–…这样的
char T2[MAXN],P2[MAXN]; //T is long,P is model str
void mem(){MEM(f2) MEM(T2) MEM(P2) }
int getFail(char *P=0,int* f=0)
{
if (P==0) P=P2;if (f==0) f=f2;
int m=strlen(P);
f[0]=f[1]=0;
For(i,m⑴)
{
int j=f[i];
while(j&&P[i]!=P[j]) j=f[j];
f[i+1]= P[i] == P[j] ? j+1 : 0;
}
}
int find(char* T=0,char* P=0,int* f=0)
{
if (T==0) T=T2;if (P==0) P=P2;if (f==0) f=f2;
int n=strlen(T),m=strlen(P);
getFail(P,f);
int j=0;
Rep(i,n)
{
while(j&&T[i]!=P[j]) j=f[j];
if (T[i]==P[j]) j++;
if (j==m) return i-m+1;
}
}
}S;
int n;
int main()
{
// freopen("la3026.in","r",stdin);
// freopen(".out","w",stdout);
int tt=0;
while(scanf("%d%s",&n,S.P2)==2)
{
printf("Test case #%d
",++tt);
S.getFail(S.P2,S.f2);
Fork(i,2,n)
{
if (i%(i-S.f2[i])==0&&S.f2[i]) printf("%d %d
",i,i/(i-S.f2[i]));
}
putchar('
');
S.mem();
}

return 0;
}

1. 本站所有资源来源于用户上传和网络，如有侵权请邮件联系站长！
2. 分享目的仅供大家学习和交流，您必须在下载后24小时内删除！
3. 不得使用于非法商业用途，不得违反国家法律。否则后果自负！
4. 本站提供的源码、模板、插件等等其他资源，都不包含技术服务请大家谅解！
5. 如有链接无法下载、失效或广告，请联系管理员处理！
6. 本站资源售价只是赞助，收取费用仅维持本站的日常运营所需！
7. 本站源码并不保证全部能正常使用，仅供有技术基础的人学习研究，请谨慎下载
8. 如遇到加密压缩包，请使用WINRAR解压,如遇到无法解压的请联系管理员！

### 2 评论

1. Thank you for great information. Hello Administ . Onwin , Onwin Giriş , Onwin Güncel Giriş , Onwin Yeni Adres , onwin

2. Hi, just required you to know I he added your site to my Google bookmarks due to your layout. But seriously, I believe your internet site has 1 in the freshest theme I??ve came across.Metropol Halı Karaca Halı Öztekin ve Selçuklu Halı Cami Halısı ve Cami Halıları Türkiye’nin En Büyük Cami Halısı Fabrikasıyız…