本题使用的算法还是KMP
最主要的片段就是前缀数组pi的理解,这里要求解的纸盒pi[n-1]有关,但是还是需要使用一个循环来依次找到前面符合的前缀(所谓符合就是可以保持既是前缀也是s的后缀的子串长度)。
#include
#include
#include
#include
#include
#include
using namespace std;
const int N=400005;
int pi[N];
void Pi(string s){
memset(pi,0,sizeof(pi));
int n=s.length();
pi[0]=0;
for(int i=1;i
j=pi[j-1];
}
if(s[i]==s[j])
j++;
pi[i]=j;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
string s;
while(cin>>s){
set
Pi(s);
int n=s.length();
if(n==1){
cout<<1<
if(s[n-1]==s[j]){
se.insert(j+1);
}
j=pi[j-1];
}
se.insert(n);
if(s[0]==s[n-1])
se.insert(1);
int k=0;
int cnt=(int)se.size();
for(set
if(k++==cnt-1)
cout<<it<
}
}
return 0;
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章