Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- const int maxn=2e6+10;
- int n,k,n1;
- string q[10],s;
- ///vector<int>sa,lcp,isa;
- int sa[maxn], lcp[maxn], isa[maxn];
- int sas[maxn], pos[maxn], is[maxn];
- int t[maxn*4];
- void gensa(){
- for(int i=0;i<n1;++i)
- sa[i]=i;
- sort(sa,sa+n1,[&](int o1, int o2){return s[o1]<s[o2];});
- for(int i=1;i<n1;++i)
- isa[sa[i]]=(s[sa[i]]!=s[sa[i-1]])?i:isa[sa[i-1]];
- for(int len=1;len<n;len*=2){
- for(int i=0;i<n1;++i){
- sas[i]=sa[i];
- pos[i]=i;
- is[i]=isa[i];
- }
- for(int i=0;i<n1;++i){
- int w=(sas[i]-len<0)?sas[i]-len+n1:sas[i]-len;
- sa[pos[is[w]]++]=w;
- }
- for(int i=1;i<n1;++i)
- isa[sa[i]]=(is[sa[i]]==is[sa[i-1]]&&is[(sa[i]+len)%n]==is[(sa[i-1]+len)%n])?isa[sa[i-1]]:i;
- }
- }
- void genlcp(){
- int k=0;
- for(int i=0;i<n-1;++i){
- int j=sa[isa[i]-1];
- while(j+k<n&&i+k&&s[i+k]==s[j+k])++k;
- lcp[isa[i]-1]=k;
- if(k)--k;
- }
- }
- void maketree(int i, int l, int r){
- if(l==r){
- t[i]=lcp[l];
- return;
- }
- int mid=(l+r)/2;
- maketree(i*2,l,mid);
- maketree(i*2+1,mid+1,r);
- t[i]=min(t[i*2],t[i*2+1]);
- }
- int query(int i, int l, int r, int ql, int qr){
- if(l>r)return (1<<30);
- if(r<ql&&qr<l)return(1<<30);
- if(ql>=l&&r<=qr)return t[i];
- int mid=(l+r)/2;
- return min(query(i*2,l,mid,ql,qr),
- query(i*2+1,mid+1,r,ql,qr));
- }
- int getstr(int pos){
- return pos/n;
- }
- void findlcs(){
- int ans=0;
- int cnts[10],used=0;
- memset(cnts,0,sizeof(cnts));
- n++;
- int l=n,r=n;
- cnts[sa[n]/n]++;
- used++;
- while(r<n1){
- r++;
- if(cnts[sa[r]/n]==0)
- used++;
- cnts[sa[r]/n]++;
- if(used==k)
- ans=max(ans,query(1,0,n1-1,l,r))
- }
- //for(int i=n;i<n1;++i)
- }
- int main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- cout.tie(NULL);
- cin>>n>>k;
- for(int i=0;i<k;++i){
- cin>>q[i];
- s+=q[i]+q[i];
- s.pop_back();
- s+="#";
- }
- n1=s.size();
- //cout<<s<<endl;
- //cout<<n1<<endl;
- gensa();
- genlcp();
- maketree(1,0,n1-1);
- int a;
- n++;
- while(cin>>a)
- cout<<getstr(a)<<endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement