和上一个1226一样吧,这个还不用翻转
然而本蒟蒻还是写不对,WA一片天,不知道自己搞什么,自从去了长沙感觉就是坑啊
while(1) iq--;
1 /*#include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #define N 100005 5 #define LL long long 6 #define eps 1e-8 7 using namespace std; 8 inline int ra() 9 { 10 int x=0,f=1; char ch=getchar(); 11 while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();} 12 while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();} 13 return x*f; 14 } 15 16 const int M=4233; 17 const int maxn=4000*233*3; 18 19 int sa[2][maxn],rank[2][maxn],height[maxn],v[M+5]; 20 char ans[205]; 21 int n,len,id[maxn],p,q,a[maxn]; 22 bool vis[M]; 23 24 void cal_sa(int sa[maxn], int rank[maxn], int Sa[maxn], int Rank[maxn], int k) 25 { 26 for (int i=1; i<=n; i++) v[rank[sa[i]]]=i; 27 for (int i=n; i>=1; i--) if (sa[i]>k) Sa[v[rank[sa[i]-k]]--]=sa[i]-k; 28 for (int i=n-k+1; i<=n; i++) Sa[v[rank[i]]--]=i; 29 for (int i=1; i<=n; i++) Rank[Sa[i]]=Rank[Sa[i-1]]+(rank[Sa[i]]!=rank[Sa[i-1]] || rank[Sa[i]+k]!=rank[Sa[i-1]+k]); 30 } 31 void get_height() 32 { 33 int k=0; 34 for (int i=1; i<=n; i++) 35 { 36 if (rank[p][i]==1) height[1]=0; 37 else 38 { 39 int j=sa[p][rank[p][i]-1]; 40 while (a[j+k]==a[i+k]) k++; 41 height[rank[p][i]]=k; 42 if (k) k--; 43 } 44 } 45 } 46 void work() 47 { 48 for (int i=1; i<=n; i++) v[a[i]]++; 49 for (int i=1; i<=M; i++) v[i]+=v[i-1]; 50 for (int i=1; i<=n; i++) sa[p][v[a[i]]--]=i; 51 for (int i=1; i<=n; i++) rank[p][sa[p][i]]=rank[p][sa[p][i-1]]+(a[sa[p][i]]!=a[sa[p][i-1]]); 52 for (int k=1; k<n; k<<=1,swap(p,q)) cal_sa(sa[p],rank[p],sa[q],rank[q],k); 53 get_height(); 54 } 55 bool check(int L) 56 { 57 int cnt=0; 58 memset(vis,0,sizeof(vis)); 59 for (int i=2; i<=n; i++) 60 { 61 if (height[i]<L) 62 { 63 cnt=0; 64 memset(vis,0,sizeof(vis)); 65 continue; 66 } 67 if (!vis[id[sa[p][i-1]]]) vis[id[sa[p][i-1]]]=1,cnt++; 68 if (!vis[id[sa[p][i]]]) vis[id[sa[p][i]]]=1,cnt++; 69 if (cnt==len) 70 { 71 for (int j=0; j<L; j++) 72 ans[j]=a[sa[p][i]+j]; 73 return 1; 74 } 75 } 76 return 0; 77 } 78 int main(int argc, char const *argv[]) 79 { 80 while (scanf("%d",&n) && n) 81 { 82 len=0; 83 memset(v,0,sizeof(v)); 84 for (int i=1; i<=n; i++) 85 { 86 char ch[205]; 87 scanf("%s",ch+1); 88 for (int j=1; j<=strlen(ch+1); j++) a[++len]=ch[j],id[len]=i; 89 a[++len]=150+i; id[len]=i; 90 } 91 swap(n,len); 92 work(); 93 // for (int i=1; i<=n; i++) cout<<height[i]<<" "<<id[sa[p][i]]<<endl; 94 int l=1,r=205; bool flag=0; 95 while (l<=r) 96 { 97 int mid=l+r>>1; 98 if (check(mid)) flag=1,l=mid+1; 99 else r=mid-1; 100 } 101 if (flag) printf("%s ",ans); 102 else puts("IDENTITY LOST"); 103 } 104 return 0; 105 }*/ 106 107 108 109 110 #include<cstdio> 111 #include<iostream> 112 #include<cstring> 113 #include<algorithm> 114 using namespace std; 115 #define maxn 888888 116 int t1[maxn],t2[maxn],c[maxn],sa[maxn],rank[maxn],height[maxn]; 117 bool cmp(int *r, int a, int b, int l) 118 { 119 return r[a]==r[b] && r[a+l]==r[b+l]; 120 } 121 void da(int str[], int n, int m) 122 { 123 n++; int *x=t1,*y=t2; 124 for (int i=0; i<m; i++) c[i]=0; 125 for (int i=0; i<n; i++) c[x[i]=str[i]]++; 126 for (int i=1; i<m; i++) c[i]+=c[i-1]; 127 for (int i=n-1; i>=0; i--) sa[--c[x[i]]]=i; 128 for (int j=1; j<=n; j<<=1) 129 { 130 int p=0; 131 for (int i=n-j; i<n; i++) y[p++]=i; 132 for (int i=0; i<n; i++) if (sa[i]>=j) y[p++]=sa[i]-j; 133 for (int i=0; i<m; i++) c[i]=0; 134 for (int i=0; i<n; i++) c[x[y[i]]]++; 135 for (int i=1; i<m; i++) c[i]+=c[i-1]; 136 for (int i=n-1; i>=0; i--) sa[--c[x[y[i]]]]=y[i]; 137 swap(x,y); 138 p=1; x[sa[0]]=0; 139 for (int i=1; i<n; i++) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; 140 if (p>=n) break; 141 m=p; 142 } 143 int k=0; n--; 144 for (int i=0; i<=n; i++) rank[sa[i]]=i; 145 for (int i=0; i<n; i++) 146 { 147 if (k) k--; 148 int j=sa[rank[i]-1]; 149 while (str[i+k]==str[j+k]) k++; 150 height[rank[i]]=k; 151 } 152 } 153 int n,res,a[maxn],id[maxn],vis[4444]; 154 char s[222],ans[222]; 155 int check(int k) 156 { 157 int cnt=0; 158 memset(vis,0,sizeof(vis)); 159 for(int i=2;i<=res;i++) 160 { 161 if(height[i]<k) 162 { 163 memset(vis,0,sizeof(vis)); 164 cnt=0; 165 continue; 166 } 167 if(!vis[id[sa[i-1]]]) 168 vis[id[sa[i-1]]]=1,cnt++; 169 if(!vis[id[sa[i]]]) 170 vis[id[sa[i]]]=1,cnt++; 171 if(cnt==n) 172 { 173 for(int j=0;j<k;j++) 174 ans[j]=a[sa[i]+j]; 175 ans[k]='