Hdoj 5008 boring string Problem

Source: Internet
Author: User


Suffix array + rmq + binary

The suffix array binary determines the location of different substrings in K, the binary LCP determines the optional range, and the rmq calculates the SA with the smallest range.

Boring string Problem Time Limit: 6000/3000 MS (Java/others) memory limit: 65536/65536 K (Java/Others)
Total submission (s): 661 accepted submission (s): 183


Problem descriptionin this problem, you are given a string S and Q queries.

For each query, you shoshould answer that when all distinct substrings of string s were sorted lexicographically, which one is the k-th smallest.

A substring si... J of the string S = a1a2... an (1 ≤ I ≤ j ≤ n) is the string AIAI + 1... AJ. two substrings SX... Y and Sz... W are cosidered to be distinct if SX... Y =sz... W
 
Inputthe input consists of multiple test cases. Please process till EOF.

Each test case begins with a line containing a string S (| S | ≤0, 105) with only lowercase letters.

Next line contains a postive integer Q (1 ≤ q ≤105), the number of questions.

Q queries are given in the next Q lines. every line contains an integer v. you shoshould calculate the K by k = (L branch R Branch v) + 1 (L, r is the output of previous question, at the beginning of each case l = r = 0, 0 <k <263, "random" denotes exclusive or)
 
Outputfor each test case, output consists of Q lines, the I-th line contains two integers L, R which is the answer to the I-th query. (The answer l, r satisfies that sl... R is the k-th smallest and if there are several L, r available, ouput L, R which with the smallest L. if there is no l, r satisfied, output "0 0 ". note that s1... n is the whole string)
 
Sample Input
aaa40235
 
Sample output
1 11 31 20 0
 
Source2014 ACM/ICPC Asia Regional Xi 'an online


#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;typedef long long int LL;const int maxn=110100;const int INF=0x3f3f3f3f;int sa[maxn],rank[maxn],rank2[maxn],h[maxn],c[maxn],*x,*y,ans[maxn];char str[maxn];bool cmp(int* r,int a,int b,int l,int n){if(r[a]==r[b]&&a+l<n&&b+l<n&&r[a+l]==r[b+l])return true;return false;}void radix_sort(int n,int sz){for(int i=0;i<sz;i++) c[i]=0;for(int i=0;i<n;i++) c[x[y[i]]]++;for(int i=1;i<sz;i++) c[i]+=c[i-1];for(int i=n-1;i>=0;i--) sa[--c[x[y[i]]]]=y[i];}void get_sa(char c[],int n,int sz=128){x=rank,y=rank2;for(int i=0;i<n;i++) x[i]=c[i],y[i]=i;radix_sort(n,sz);for(int len=1;len<n;len<<=1){int yid=0;for(int i=n-len;i<n;i++) y[yid++]=i;for(int i=0;i<n;i++) if(sa[i]>=len) y[yid++]=sa[i]-len;radix_sort(n,sz);swap(x,y);x[sa[0]]=yid=0;for(int i=1;i<n;i++){x[sa[i]]=cmp(y,sa[i],sa[i-1],len,n)?yid:++yid;}sz=yid+1;if(sz>=n) break;}for(int i=0;i<n;i++) rank[i]=x[i];}void get_h(char str[],int n){int k=0; h[0]=0;for(int i=0;i<n;i++){if(rank[i]==0) continue;k=max(k-1,0);int j=sa[rank[i]-1];while(i+k<n&&j+k<n&&str[i+k]==str[j+k]) k++;h[rank[i]]=k;}}LL Range[maxn];int bin(LL x,int n){int ans=-1;int low=0,high=n-1,mid;while(low<=high){mid=(low+high)/2;if(Range[mid]<x){ans=mid;low=mid+1;}else{high=mid-1;}}return ans;}int lcp[maxn][20],mmm[maxn][20];void RMQ_init(int n){for(int i=0;i<n;i++){lcp[i][0]=h[i];mmm[i][0]=sa[i];}lcp[0][0]=0x3f3f3f3f;int sz=floor(log(n*1.0)/log(2.0));for(int i=1;(1<<i)<=n;i++){for(int j=0;j+(1<<i)-1<n;j++){lcp[j][i]=min(lcp[j][i-1],lcp[j+(1<<(i-1))][i-1]);mmm[j][i]=min(mmm[j][i-1],mmm[j+(1<<(i-1))][i-1]);}}}int LCP(int l,int r,int n){if(l==r) return n-sa[l];l++;if(l>r) swap(l,r);int k=0;while(1<<(k+1)<=r-l+1) k++;return min(lcp[l][k],lcp[r-(1<<k)+1][k]);}int MMM(int l,int r){if(l>r) swap(l,r);int k=0;while(1<<(k+1)<=r-l+1) k++;return min(mmm[l][k],mmm[r-(1<<k)+1][k]);}int binID(int x,int n,int len){int ans=x;int low=x,high=n-1,mid;while(low<=high){mid=(low+high)/2;if(LCP(x,mid,n)>=len){ans=mid;low=mid+1;}else high=mid-1;}return ans;}int main(){while(scanf("%s",str)!=EOF){int n=strlen(str);get_sa(str,n);get_h(str,n);RMQ_init(n);for(int i=0;i<n;i++){Range[i]=(n-sa[i])-h[i];if(i-1>=0) Range[i]+=Range[i-1];}int q;scanf("%d",&q);int L=0,R=0;LL V;while(q--){scanf("%I64d",&V);LL K=(L^R^V)+1LL;if(K>Range[n-1]){L=0;R=0;printf("%d %d\n",L,R);continue;}int id=bin(K,n);LL jian=0;if(id>=0) jian=Range[id];LL res=K-jian; id++;int len=h[id]+res;int hid=binID(id,n,len);int Left=MMM(id,hid);printf("%d %d\n",Left+1,Left+len);L=Left+1;R=Left+len;}}return 0;}


Hdoj 5008 boring string Problem

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.