Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ///100p
- #include <bits/stdc++.h>
- #define maxN 200005
- #define maxLog 24
- using namespace std;
- long long sa[maxLog][maxN];
- long long pos[maxN],sum[maxN],lcp[maxN];
- long long n,i,j,q,loga,x;
- string str;
- struct nod
- {
- long long nr1,nr2,ind;
- }l[maxN];
- bool cmp(const nod &a,const nod &b)
- {
- if(a.nr1==b.nr1)
- return a.nr2<b.nr2;
- return a.nr1<b.nr1;
- }
- void build_SA()
- {
- for(int i=0;i<n;i++)
- sa[0][i]=str[i];
- for(loga=1;(1<<loga)<n;loga++)
- {
- for(j=0;j<n;j++)
- {
- l[j].ind=j;
- l[j].nr1=sa[loga-1][j];
- if(j+(1<<(loga-1))<n)
- l[j].nr2=sa[loga-1][j+(1<<(loga-1))];
- else l[j].nr2=-1;
- }
- sort(l,l+n,cmp);
- for(j=0;j<n;j++)
- if(j && l[j].nr1==l[j-1].nr1 && l[j].nr2==l[j-1].nr2)
- sa[loga][l[j].ind]=sa[loga][l[j-1].ind];
- else sa[loga][l[j].ind]=j;
- }
- loga--;
- for(int i=0;i<n;i++)
- pos[sa[loga][i]]=i;
- }
- void build_lcp()
- {
- int k=0;
- vector<int> _rank(n+5,0);
- for(int i=0;i<n;i++)
- _rank[pos[i]]=i;
- lcp[0]=0;
- for(int i=0;i<n;i++,k?k--:0)
- {
- if(_rank[i]==n-1){
- k=0;
- continue;
- }
- int j=pos[_rank[i]+1];
- while(i+k<n && j+k<n && str[i+k]==str[j+k])
- k++;
- lcp[_rank[i]+1]=k;
- }
- }
- int main()
- {
- ifstream f("ksir.in");
- ofstream g("ksir.out");
- f>>str;
- n=str.size();
- build_SA();
- build_lcp();
- sum[0]=n-pos[0];
- for(i=1;i<n;i++)
- sum[i]=sum[i-1]+(n-pos[i]-lcp[i]);
- f>>q;
- while(q--)
- {
- f>>x;
- int poz=lower_bound(sum,sum+n,x)-sum;
- for(j=0,i=pos[poz];j<x-sum[poz-1]+lcp[poz];i++,j++)
- g<<str[i];
- g<<'\n';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement