国家队论文链接:
(更新中)
poj 1226 Substrings http://poj.org/problem?id=1226
/************************************************************** Problem:poj 1226 User: youmi Language: C++ Result: Accepted Time:0MS Memory:1056K ****************************************************************/ //#pragma comment(linker, "/STACK:1024000000,1024000000") //#include<bits/stdc++.h> #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <stack> #include <set> #include <sstream> #include <cmath> #include <queue> #include <deque> #include <string> #include <vector> #define zeros(a) memset(a,0,sizeof(a)) #define ones(a) memset(a,-1,sizeof(a)) #define sc(a) scanf("%d",&a) #define sc2(a,b) scanf("%d%d",&a,&b) #define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c) #define scs(a) scanf("%s",a) #define sclld(a) scanf("%I64d",&a) #define pt(a) printf("%d\n",a) #define ptlld(a) printf("%I64d\n",a) #define rep0(i,n) for(int i=0;i<n;i++) #define rep1(i,n) for(int i=1;i<=n;i++) #define rep_1(i,n) for(int i=n;i>=1;i--) #define rep_0(i,n) for(int i=n-1;i>=0;i--) #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define lson (step<<1) #define rson (lson+1) #define esp 1e-6 #define oo 0x3fffffff #define TEST cout<<"*************************"<<endl using namespace std; typedef long long ll; const int maxn=200100; int wa[maxn],wb[maxn],wv[maxn],cnt[maxn]; int cmp(int *r,int a,int b,int l) {return r[a]==r[b]&&r[a+l]==r[b+l];} void da(int *r,int *sa,int n,int m) { int i,j,p,*x=wa,*y=wb,*t; for(i=0;i<m;i++) cnt[i]=0; for(i=0;i<n;i++) cnt[x[i]=r[i]]++; for(i=1;i<m;i++) cnt[i]+=cnt[i-1]; for(i=n-1;i>=0;i--) sa[--cnt[x[i]]]=i; for(j=1,p=1;p<n;j*=2,m=p) { for(p=0,i=n-j;i<n;i++) y[p++]=i; for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j; for(i=0;i<n;i++) wv[i]=x[y[i]]; for(i=0;i<m;i++) cnt[i]=0; for(i=0;i<n;i++) cnt[wv[i]]++; for(i=1;i<m;i++) cnt[i]+=cnt[i-1]; for(i=n-1;i>=0;i--) sa[--cnt[wv[i]]]=y[i]; for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; } return; } int rk[maxn],height[maxn]; void calheight(int *r,int *sa,int n) { int i,j,k=0; for(i=1;i<=n;i++) rk[sa[i]]=i; for(i=0;i<n;height[rk[i++]]=k) for(k?k--:0,j=sa[rk[i]-1];r[i+k]==r[j+k];k++); return; } char str[maxn]; int r[maxn],sa[maxn]; int who[maxn]; int vis[500]; int n,m; bool check(int temp) { int tot=0; zeros(vis); for(int i=2;i<=n;i++) { if(height[i]<temp) { tot=0; zeros(vis); } else { if(!vis[who[sa[i]]]) { vis[who[sa[i]]]=1; tot++; } if(!vis[who[sa[i-1]]]) { vis[who[sa[i-1]]]=1; tot++; } if(tot==m) return true; } } return false; } int main() { //freopen("in.txt","r",stdin); int T_T; scanf("%d",&T_T); for(int kase=1;kase<=T_T;kase++) { n=0; int sp=150; sc(m); rep1(i,m) { scs(str); int s1=strlen(str); for(int j=0;str[j];j++) { who[n]=i; r[n++]=str[j]; } who[n]=sp; r[n++]=sp++; for(int j=0;str[j];j++) { who[n]=i; r[n++]=str[s1-j-1]; } who[n]=sp; r[n++]=sp++; } r[n]=0; da(r,sa,n+1,sp); calheight(r,sa,n); int l=0,r=strlen(str); int mid=0,ans=0; while(l<=r) { mid=(l+r)>>1; if(check(mid)) { l=mid+1; ans=mid; } else r=mid-1; } pt(ans); } return 0; }
时间: 2024-10-19 18:08:30