题目链接:https://cn.vjudge.net/contest/248066#problem/F
参考链接:https://blog.youkuaiyun.com/u013167299/article/details/46050405
Power Strings
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).
Input
Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.
Output
For each s you should print the largest n such that s = a^n for some string a.
Sample Input
abcd
aaaa
ababab
.
Sample Output
1
4
3
Hint
This problem has huge input, use scanf instead of cin to avoid time limit exceed.
最长公共前后缀
正版:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAXN = 1e6+10;
char s1[MAXN];
char s2[MAXN];
int net[MAXN];
int lens1;
int lens2;
void getnet(){
int i=0;
int j=-1;
net[0]=-1;
while(i<lens1){
if(j==-1 || s1[i]==s1[j]){
i++;
j++;
net[i]=j;
}else{
j=net[j];
}
}
}
int main(){
while(scanf("%s",s1)!= EOF){
if(s1[0]=='.'){
break;
}
lens1=strlen(s1);
getnet();
int k = lens1 - net[lens1];
if(lens1%k==0){
cout<<lens1/k<<endl;
}
else{
cout<<1<<endl;
}
}
return 0;
}
盗版:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 1e6+100;
int nxt[MAXN];
char s1[MAXN];
int n,cut;
void getnxt(){
int i=1;
int j=0;
nxt[0]=0;
while(i<n){
if(s1[i]==s1[j]){
nxt[i]=j+1;
i++;
j++;
}else if(!j){
i++;
}else{
j=nxt[j-1];
}
}
}
int main(){
while( scanf("%s",s1)!=EOF){
if(s1[0]=='.'){
break;
}
n=strlen(s1);
getnxt();
int k=n-nxt[n-1];
if(n%k==0){
cout<<n/k<<endl;
}else{
cout<<1<<endl;
}
memset(nxt,0,sizeof(nxt));
}
return 0;
}