思路:先用kmp求出nxt数组,当n%(n-nxt[n])==0时,n/(n-nxt[n])就是答案。
代码:
#include<cstring>
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
#define maxn 1000000
string s;
int n;
int nxt[maxn+5]= {0};
void make_nxt() {
nxt[0]=-1;
for(int i=0; i<n; i++) {
int j=nxt[i];
while(s[j]!=s[i]&&j>=0) j=nxt[j];
nxt[i+1]=j+1;
}
for(int i=0; i<n; i++) nxt[i]=nxt[i+1];
}
int main() {
while(true) {
cin>>s;
if(s[0]=='.') break;
n=s.size();
make_nxt();
if(n%(n-nxt[n])==0) printf("%d\n",n/(n-nxt[n]));
else printf("1\n");
}
return 0;
}
本文介绍了一种利用KMP算法解决字符串问题的方法——PowerStrings。通过构建next数组,判断字符串是否为某个基串的重复构成。代码实现简洁高效。
652

被折叠的 条评论
为什么被折叠?



