題目
思路
- 看到前后綴就想到kmp了
- 要求的是字符串的所有前后綴相同的長度
- KMP的next求解的時(shí)候,如果P[k]!=P[j],就令k=NEXT[k],這樣找到的k之前的字符串仍然是與后綴相等的前綴(但是變短了)。
- 最后得到的next數(shù)組,next[k]儲存的是滿足條件的最長前綴的長度,那么滿足條件的前綴只需要遍歷k = next[k],直到長度為0就行了。
AC代碼
#include<iostream>
#include<stack>
using namespace std;
const int MAXN=10000002;
string P;
string T;
int NEXT[MAXN];
int plen,tlen;
void getNEXT(){
NEXT[0] = -1;
int k = -1 ;
int j = 0 ;
while(j<plen){
if(k==-1||P[k]==P[j]){
NEXT[++j] = ++k;
}else{
k = NEXT[k];
}
}
}
int main(){
ios::sync_with_stdio(false);
while(cin>>P){
plen=P.length();
getNEXT();
// for(int i = 0 ; i<=plen;i++){
// cout<<" "<<NEXT[i];
// }
stack<int> S;
int k = plen;
S.push(plen);
while(NEXT[k] != 0){
k = NEXT[k];
S.push(k);
// cout<<"k"<<k<<"\n";
}
int size = S.size();
while(size--){
if(size!=0)
cout<<S.top()<<" ";
else cout<<S.top();
S.pop();
}
cout<<"\n";
// P="";
}
return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。