#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define N 30000 int n,p,np,q,nq,cnt,c[N][30],fa[N],data[N],stt[N]; char s[N]; void go(int x,int num){ p=np; stt[np=++cnt]=stt[p]+1; data[np]=num; for (;p && !c[p][x];p=fa[p]) c[p][x]=np; if (!p) fa[np]=1; else{ if (stt[p]+1==stt[q=c[p][x]]) fa[np]=q; else{ stt[nq=++cnt]=stt[p]+1; memcpy(c[nq],c[q],sizeof c[q]); fa[nq]=fa[q]; fa[q]=fa[np]=nq; for (;p && c[p][x]==q;p=fa[p]) c[p][x]=nq; } } } void sam(char s[]){ int len=strlen(s+1); cnt=1; p=np=1; memset(c,0,sizeof c); memset(fa,0,sizeof fa); memset(data,0,sizeof data); memset(stt,0,sizeof stt); for (int i=1;i<=len;i++) go(s[i]-'a'+1,i); for (int i=1;i<=len;i++) go(s[i]-'a'+1,i+len); } void solve(){ int xb=1,len=strlen(s+1); for (int i=1;i<=len;i++) for (int j=1;j<=26;j++) if (c[xb][j]){xb=c[xb][j]; break;} printf("%d\n",data[xb]-len+1); } int main(){ scanf("%d",&n); for (int i=1;i<=n;i++){ scanf("%s",s+1); sam(s); solve(); } return 0; }
|