链接:点击打开链接
题意:从大到小输出所有既是前缀有是后缀的字符串的长度
代码:
#include <map>
#include <set>
#include <queue>
#include <string>
#include <math.h>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int siz=400005;
char T[siz];
int nex[siz];
void getnex(int len){
int i,j;
j=-1,i=0;
nex[0]=-1;
while(i<len){
if(j==-1||T[i]==T[j])
nex[++i]=++j;
else
j=nex[j];
}
}
int main(){
int i,u,len;
vector<int> G;
while(scanf("%s",T)!=EOF){
len=strlen(T);
getnex(len);
u=len;
G.clear();
while(u!=0){ //按照最后一个位置的next数组往前找
G.push_back(u);
u=nex[u];
}
sort(G.begin(),G.end());
for(i=0;i<G.size();i++){
if(i!=0)
printf(" ");
printf("%d",G[i]);
}
printf("\n");
}
return 0;
}