Nusrat_Ullah

temp

May 25th, 2021 (edited)
1,010
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.84 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MX=200003;
  4. int t,rk[MX],v_rk[MX],sx[MX],v_sx[MX],lcp[MX],v_lcp[MX],vv[MX],st[30][MX],re[30][MX];
  5. string q,w;
  6. void process_occur()
  7. {
  8.     int g,h,x;
  9.     for(g=0;g<26;g++){
  10.         x=q[0]-'a';
  11.         st[g][0]=(x==g)?1:0;
  12.         re[g][0]=0;
  13.         for(h=1;q[h];h++){
  14.             x=q[h]-'a';
  15.             st[g][h]=st[g][h-1]+((x==g)?1:0);
  16.             re[g][h]=0;
  17.         }
  18.     }
  19. }
  20. void process_suffix(int z)
  21. {
  22.     int g,re,x,xx;
  23.     int nt[MX]={0};
  24.     xx=max(t,300);
  25.     for(g=0;g<q.length();g++)
  26.         if(g+z<q.length()) nt[rk[g+z]]++;
  27.         else nt[0]++;
  28.     for(g=re=0;g<xx;g++)
  29.         x=nt[g], nt[g]=re, re+=x;
  30.     for(g=0;g<q.length();g++)
  31.         if(sx[g]+z<q.length()) v_sx[nt[rk[sx[g]+z]]++]=sx[g];
  32.         else v_sx[nt[0]++]=sx[g];
  33.     for(g=0;g<q.length();g++)
  34.         sx[g]=v_sx[g];
  35. }
  36. void create_suffix()
  37. {
  38.     int g,h,r;
  39.     for(g=0;g<q.length();g++)sx[g]=g, rk[g]=q[g];
  40.     for(g=1;g<q.length();g<<=1){
  41.         process_suffix(g);
  42.         process_suffix(0);
  43.         v_rk[sx[0]]=r=0;
  44.         for(h=1;h<q.length();h++)
  45.             if(rk[sx[h]]==rk[sx[h-1]]&&rk[sx[h]+g]==rk[sx[h-1]+g])
  46.                 v_rk[sx[h]]=r;
  47.             else v_rk[sx[h]]= ++r;
  48.         for(h=0;h<q.length();h++)
  49.             rk[h]=v_rk[h];
  50.         if(rk[sx[q.length()-1]]==q.length()-1)break;
  51.     }
  52. }
  53. //LCP
  54. void longest_same_prefix()
  55. {
  56.     int g,lo;
  57.     vv[sx[0]]=-1;
  58.     for(g=1;g<t;g++) vv[sx[g]]=sx[g-1];
  59.     for(g=lo=0;g<t;g++){
  60.         if(vv[g]==-1){
  61.             v_lcp[g]=0;
  62.             continue;
  63.         }
  64.         while(q[g+lo]==q[vv[g]+lo])lo++;
  65.         v_lcp[g]=lo;
  66.         lo=max(0,lo-1);
  67.     }
  68.     for(g=0;g<t;g++)
  69.         lcp[g]=v_lcp[sx[g]];
  70. }
  71. //Root Check
  72. int root(int z)
  73. {
  74.     return z<(t-w.length()-1)?1:2;
  75. }
  76. void process_result()
  77. {
  78.     int g,h,x,lo,hi,nt;
  79.     for(g=0;g<26;g++){
  80.         for(h=1;h<t;h++){
  81.             x=q[sx[h]]-'a';
  82.             if(x==g&&root(sx[h])!=root(sx[h-1])){
  83.                 hi=sx[h]+lcp[h]-1;
  84.                 lo=sx[h]-1;
  85.                 nt=st[g][hi]-((lo-1)<0?0:st[g][lo-1]);
  86.                 re[g][nt]++;
  87.             }
  88.         }
  89.     }
  90. }
  91. void printall()
  92. {
  93.     int g;
  94.     for(g=0;g<t;g++){
  95.         printf("%d\t%d\t%d\t%s\n",sx[g],root(sx[g]),lcp[g],q.c_str()+sx[g]);
  96.     }
  97. }
  98. int main()
  99. {
  100.     int g,ts,tm,y,x,s=1;
  101.     string a;
  102.     scanf("%d",&ts);
  103.     while(ts--){
  104.         cin>>tm>>q;
  105.         process_occur();
  106.         w=q;
  107.         reverse(w.begin(),w.end());
  108.         q+=w, q+="$";
  109.         t=q.size();
  110.         create_suffix();
  111.         longest_same_prefix();
  112.         process_result();
  113.         printall();
  114.         printf("Case %d:\n",s++);
  115.         cin>>y>>a;
  116.         for(g=0;g<y;g++){
  117.             scanf("%d",&x);
  118.             printf("%d\n",(x>(int)1e5)?0:re[(a[g]-'a')][x]);
  119.         }
  120.     }
  121.     return 0;
  122. }
  123.  
Advertisement
Add Comment
Please, Sign In to add comment