标签:
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=5558
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cmath> #include <bitset> using namespace std; const int N=1e5+5; char s[N]; int wa[N],wb[N],wv[N],wss[N]; int rankk[N],height[N],sa[N]; int cmp(int *r,int a,int b,int l){ return r[a]==r[b]&&r[a+l]==r[b+l]; } void da(char *r,int *sa,int n,int m) { int i,j,p,*x=wa,*y=wb,*t; for(i=0;i<m;i++) wss[i]=0; for(i=0;i<n;i++) wss[x[i]=r[i]]++; for(i=1;i<m;i++) wss[i]+=wss[i-1]; for(i=n-1;i>=0;i--) sa[--wss[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++) wss[i]=0; for(i=0;i<n;i++) wss[wv[i]]++; for(i=1;i<m;i++) wss[i]+=wss[i-1]; for(i=n-1;i>=0;i--) sa[--wss[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 ; } void calheight(char *r,int *sa,int n) { int i,j,k=0; for(i=1;i<=n;i++) rankk[sa[i]]=i; for(i=0;i<n;height[rankk[i++]]=k) for(k?k--:0,j=sa[rankk[i]-1];r[i+k]==r[j+k];k++); return ; } int main() { int T,Case=1; cin>>T; while(T--) { scanf("%s",s); int len=strlen(s); da(s,sa,len+1,130); calheight(s,sa,len); printf("Case #%d:\n",Case++); int i=0; while(i<len) { int pos,k=0; int rk=rankk[i]; int d=height[rk]; for(int j=rk;j>=1&&height[j]!=0;j--) { d=min(d,height[j]); if(d<k) break; if(sa[j-1]<i&&((d>k)||(d==k&&sa[j-1]<pos))) { k=d; pos=sa[j-1]; } } if(rk<len){ d=height[rk+1]; for(int j=rk+1; j<=len&&height[j]!=0; j++) { d=min(d,height[j]); if(d<k) break; if(sa[j]<i&&((d>k)||(d==k&&sa[j]<pos))) { k=d; pos=sa[j]; } } } if(k) printf("%d %d\n",k,pos),i+=k; else printf("%d %d\n",-1,(int)s[i++]); } } return 0; }
(HDU 5558) 2015ACM/ICPC亚洲区合肥站---Alice's Classified Message(后缀数组)
标签:
原文地址:http://www.cnblogs.com/chen9510/p/5956054.html