B. 【例题2】重复子串
题目
思路
设
p
[
i
]
p[i]
p[i] 表示字符串
1
1
1 ~
(
i
−
1
)
(i-1)
(i−1)的最长相同前缀后缀,则:
若
n
%
(
n
−
p
[
n
]
)
=
=
0
n\%(n-p[n])==0
n%(n−p[n])==0,答案为
n
/
(
n
−
p
[
n
]
)
n/(n-p[n])
n/(n−p[n])
否则,答案为 1。
代码
#include<iostream>
using namespace std;
string s;
char ch;
int n,p[1000001];
void pre(string s)//求最长相同前缀后缀
{
int i=1,j=0;
while(i<n)
{
if(s[i]==s[j])
{
i++;
j++;
p[i]=j;
}
else
{
if(j) j=p[j];
else p[++i]=0;
}
}
}
int main()
{
cin>>s;
while(s!=".")
{
n=s.size();
pre(s);
if((n-p[n]>0)&&n%(n-p[n])==0) cout<<n/(n-p[n])<<endl;
else cout<<1<<endl;
ch=getchar();//输入换行符
cin>>s;
}
}