1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
#include<stdio.h> #include<algorithm> #include<vector> #include<string.h> #include<string> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; const int Maxn = 3e4+5; int n, k,t; string s; int rank[Maxn], temp[Maxn],sa[Maxn]; bool (int i, int j){ if(rank[i] != rank[j]) return rank[i] < rank[j]; else { int ri = i+k<=n?rank[i+k]:-1; int rj = j+k<=n?rank[j+k]:-1; return ri < rj; } } void construct_sa(string s, int sa[]){ n=s.length(); for(int i=0; i<=n; i++) { sa[i] = i; rank[i] = i<n?s[i]:-1; } for(k=1; k<=n; k*=2){ sort(sa, sa+n+1, compare_sa); temp[sa[0]] = 0; for(int i=1; i<=n; i++){ temp[sa[i]] = temp[sa[i-1]] + (compare_sa(sa[i-1], sa[i])?1:0); } for(int i=0; i<=n; i++) rank[i] = temp[i]; } } int main() { scanf("%d",&t); while(t--) { cin>>s; int len=s.length(),ans,dex=-1; s=s+s+char('z'+1); construct_sa(s,sa); for(int i=0;i<=2*len;i++) if(sa[i]<len) { printf("%dn",sa[i]+1);break; } } return 0; }
|
近期评论