Advertisement
STEFAN_STOYANOV

common_sa

Feb 9th, 2023
751
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.28 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=2e6+10;
  4. int n,k,n1;
  5. string q[10],s;
  6. ///vector<int>sa,lcp,isa;
  7. int sa[maxn], lcp[maxn], isa[maxn];
  8. int sas[maxn], pos[maxn], is[maxn];
  9. int t[maxn*4];
  10. void gensa(){
  11.     for(int i=0;i<n1;++i)
  12.         sa[i]=i;
  13.     sort(sa,sa+n1,[&](int o1, int o2){return s[o1]<s[o2];});
  14.     for(int i=1;i<n1;++i)
  15.         isa[sa[i]]=(s[sa[i]]!=s[sa[i-1]])?i:isa[sa[i-1]];
  16.     for(int len=1;len<n;len*=2){
  17.         for(int i=0;i<n1;++i){
  18.             sas[i]=sa[i];
  19.             pos[i]=i;
  20.             is[i]=isa[i];
  21.         }
  22.         for(int i=0;i<n1;++i){
  23.             int w=(sas[i]-len<0)?sas[i]-len+n1:sas[i]-len;
  24.             sa[pos[is[w]]++]=w;
  25.         }
  26.         for(int i=1;i<n1;++i)
  27.             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;
  28.     }
  29. }
  30.  
  31. void genlcp(){
  32.     int k=0;
  33.     for(int i=0;i<n-1;++i){
  34.         int j=sa[isa[i]-1];
  35.         while(j+k<n&&i+k&&s[i+k]==s[j+k])++k;
  36.         lcp[isa[i]-1]=k;
  37.         if(k)--k;
  38.     }
  39. }
  40.  
  41. void maketree(int i, int l, int r){
  42.     if(l==r){
  43.         t[i]=lcp[l];
  44.         return;
  45.     }
  46.     int mid=(l+r)/2;
  47.     maketree(i*2,l,mid);
  48.     maketree(i*2+1,mid+1,r);
  49.     t[i]=min(t[i*2],t[i*2+1]);
  50. }
  51.  
  52. int query(int i, int l, int r, int ql, int qr){
  53.     if(l>r)return (1<<30);
  54.     if(r<ql&&qr<l)return(1<<30);
  55.     if(ql>=l&&r<=qr)return t[i];
  56.     int mid=(l+r)/2;
  57.     return min(query(i*2,l,mid,ql,qr),
  58.                query(i*2+1,mid+1,r,ql,qr));
  59. }
  60.  
  61. int getstr(int pos){
  62.     return pos/n;
  63. }
  64.  
  65. void findlcs(){
  66.     int ans=0;
  67.     int cnts[10],used=0;
  68.     memset(cnts,0,sizeof(cnts));
  69.     n++;
  70.     int l=n,r=n;
  71.     cnts[sa[n]/n]++;
  72.     used++;
  73.     while(r<n1){
  74.         r++;
  75.         if(cnts[sa[r]/n]==0)
  76.             used++;
  77.         cnts[sa[r]/n]++;
  78.         if(used==k)
  79.             ans=max(ans,query(1,0,n1-1,l,r))
  80.     }
  81.     //for(int i=n;i<n1;++i)
  82. }
  83.  
  84. int main()
  85. {
  86.     ios_base::sync_with_stdio(false);
  87.     cin.tie(NULL);
  88.     cout.tie(NULL);
  89.     cin>>n>>k;
  90.     for(int i=0;i<k;++i){
  91.         cin>>q[i];
  92.         s+=q[i]+q[i];
  93.         s.pop_back();
  94.         s+="#";
  95.     }
  96.     n1=s.size();
  97.     //cout<<s<<endl;
  98.     //cout<<n1<<endl;
  99.     gensa();
  100.     genlcp();
  101.     maketree(1,0,n1-1);
  102.     int a;
  103.     n++;
  104.     while(cin>>a)
  105.         cout<<getstr(a)<<endl;
  106. return 0;
  107. }
  108.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement