题目:Seek the Name, Seek the Fame
思路:
主要是要理解next的含义。
粘一下大佬的思路
代码:
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define maxn 400000
int n;
char a[maxn+5];
int nxt[maxn+5]={0};
void make_nxt(){
nxt[0]=-1;
for(int i=0;i<n;i++) {
int j=nxt[i];
while(a[i]!=a[j]&&j>=0) {
j=nxt[j];
}
nxt[i+1]=j+1;
}
for(int i=0;i<n;i++) nxt[i]=nxt[i+1];
}
void mtch(){
vector<int> ans;
int j=n-1;
while(nxt[j]>0) {
ans.push_back(j+1);
j=nxt[j]-1;
}
printf("%d",j+1);
for(int i=ans.size()-1;i>=0;i--) printf(" %d",ans[i]);
printf("\n");
}
int main() {
while(~scanf("%s",a)) {
n=strlen(a);
make_nxt();
mtch();
}
return 0;
}