佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物。生日礼物放在一个神奇的箱子中。箱子外边写了
一个长为n的字符串s,和m个问题。佳媛姐姐必须正确回答这m个问题,才能打开箱子拿到礼物,升职加薪,出任CE
O,嫁给高富帅,走上人生巅峰。每个问题均有a,b,c,d四个参数,问你子串s[a..b]的所有子串和s[c..d]的最长公
共前缀的长度的最大值是多少?佳媛姐姐并不擅长做这样的问题,所以她向你求助,你该如何帮助她呢?
标签:
对于每一次询问,输出答案。
9 1
baabbbbab
2 5 7 9
out:
1
in:
5 1
aaaab
2 3 4 5
out:
1
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define MAXN 100010 4 #define INF 1e9 5 int Ws[MAXN],wa[MAXN],wb[MAXN],sa[MAXN],wv[MAXN],Rank[MAXN],height[MAXN]; 6 char str[MAXN]; 7 int read() 8 { 9 int s=0,fh=1;char ch=getchar(); 10 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)fh=-1;ch=getchar();} 11 while(ch>=‘0‘&&ch<=‘9‘){s=s*10+(ch-‘0‘);ch=getchar();} 12 return s*fh; 13 } 14 int cmp(int *r,int a,int b,int l){return (r[a]==r[b])&&(r[a+l]==r[b+l]);} 15 void DA(char *r,int *sa,int n,int m) 16 { 17 int i,j,p,*x=wa,*y=wb,*t; 18 for(i=0;i<m;i++)Ws[i]=0; 19 for(i=0;i<n;i++)Ws[x[i]=r[i]]++; 20 for(i=0;i<m;i++)Ws[i]+=Ws[i-1]; 21 for(i=n-1;i>=0;i--)sa[--Ws[x[i]]]=i; 22 for(j=1,p=1;p<n;j*=2,m=p) 23 { 24 for(p=0,i=n-j;i<n;i++)y[p++]=i; 25 for(i=0;i<n;i++)if(sa[i]>=j)y[p++]=sa[i]-j; 26 for(i=0;i<n;i++)wv[i]=x[y[i]]; 27 for(i=0;i<m;i++)Ws[i]=0; 28 for(i=0;i<n;i++)Ws[wv[i]]++; 29 for(i=0;i<m;i++)Ws[i]+=Ws[i-1]; 30 for(i=n-1;i>=0;i--)sa[--Ws[wv[i]]]=y[i]; 31 for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++) 32 x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; 33 } 34 } 35 void calheight(int n) 36 { 37 int i,j,k=0; 38 for(i=1;i<=n;i++)Rank[sa[i]]=i; 39 for(i=0;i<n;height[Rank[i++]]=k) 40 for(k?k--:0,j=sa[Rank[i]-1];str[i+k]==str[j+k];k++); 41 } 42 int Solve(int s1,int s2,int s3,int s4,int n) 43 { 44 int len=0,wz,i,LEN=INF; 45 wz=Rank[s3-1];//len=s4-s3+1; 46 if(sa[wz]>=s1&&sa[wz]<=s2)len=max(len,min(s4-s3+1,s2-sa[wz]+1)); 47 for(i=wz;i>=2;i--) 48 { 49 if(height[i]==0||height[i]<=len)break; 50 if(sa[i-1]>=s1&&sa[i-1]<=s2) 51 { 52 len=max(len,min(min(min(LEN,height[i]),s2-sa[i-1]+1),s4-s3+1)); 53 //LEN=min(LEN,len); 54 } 55 LEN=min(LEN,height[i]); 56 } 57 LEN=INF; 58 for(i=wz+1;i<=n;i++) 59 { 60 if(height[i]==0||height[i]<=len)break; 61 if(sa[i]>=s1&&sa[i]<=s2) 62 { 63 len=max(len,min(min(min(LEN,height[i]),s2-sa[i]+1),s4-s3+1)); 64 //LEN=min(LEN,len); 65 } 66 LEN=min(LEN,height[i]); 67 } 68 return len; 69 } 70 int main() 71 { 72 freopen("heoi2016_str.in","r",stdin); 73 freopen("heoi2016_str.out","w",stdout); 74 int n,m,lstr,i,s1,s2,s3,s4; 75 n=read();m=read(); 76 scanf("\n%s",str); 77 lstr=strlen(str); 78 str[lstr+1]=0; 79 DA(str,sa,lstr+1,256); 80 calheight(lstr); 81 for(i=1;i<=n;i++)sa[i]++; 82 for(i=1;i<=m;i++) 83 { 84 s1=read();s2=read();s3=read();s4=read(); 85 printf("%d\n",Solve(s1,s2,s3,s4,n)); 86 } 87 fclose(stdin); 88 fclose(stdout); 89 return 0; 90 }
Bzoj4556: [Tjoi2016&Heoi2016]字符串 后缀数组
标签:
原文地址:http://www.cnblogs.com/Var123/p/5572691.html