omar-alhelo

Untitled

Feb 28th, 2020
1,077
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.61 KB | None | 0 0
  1. /// __Macro's__
  2. // #pragma GCC optimize("-O0")
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5. #define ll                   long long
  6. #define II                   pair<int,int>
  7. #define III                  pair<int, II>
  8. #define VI                   vector<int>
  9. #define VII                  vector<II>
  10. #define VIII                 vector<III>
  11. #define VVI                  vector<vector<int> >
  12. #define VVII                 vector<vector<II> >
  13. #define fr                   first
  14. #define sc                   second
  15. #define mkpr                 make_pair
  16. #define PQ                   priority_queue
  17. #define pb                   push_back
  18. #define eb                   emplace_back
  19. #define all(v)               v.begin(), v.end()
  20. #define LINE                 putc('\n', stdout)
  21. #define SPACE                putc(' ' , stdout)
  22. #define TAB                  putc('\t', stdout)
  23. #define fillarr(arr, val)    fill((int*)arr, (int*)arr+(sizeof(arr)/sizeof(int)), val)
  24. #define Log2(x)              (31^__builtin_clz(x))
  25. #define inf                  1000000007
  26. #define MOD                  1000000007
  27. #define getint ReadInt()
  28. const char IO_MODE = 3; // in-->00<--out (MSB-->LSB) | 0: Norm, 1: Fast
  29. inline ll ReadInt(){ll x=0,s=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')s=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';
  30. c=getchar();}return s*x;}inline void WriteInt(ll x){char c[20];if(!x){putchar('0');return;}if(x<0)putchar('-'),x=-x;int i=0;while(x>0)
  31. c[++i]=x%10,x/=10;while(i)putchar(c[i--]+48);}template <typename T>inline void out(T x){if(IO_MODE&1)WriteInt(x);else if(typeid(x)==typeid(int))
  32. printf("%i", x);else printf("%lld", (ll)x);}template<typename T, typename... Args>inline void out(T x,Args...args){out(x);SPACE;out(args...);}
  33. template <typename T>inline void in(T &x){if(IO_MODE&2) x=ReadInt();else if(typeid(x)==typeid(int))scanf("%i",&x);else if(typeid(x)==typeid(ll))
  34. scanf("%lld",&x);}template<typename T, typename... Args>inline void in(T &x,Args&...args){in(x);in(args...);}
  35. int aa,bb,cc,dd,ee,ff,gg,hh,ii,jj,kk,mm,nn,oo,pp,qq,rr,ss,tt,uu,vv,ww,xx,yy,zz;
  36. int tc;
  37. ///
  38. /// ---------------------------------------------- (Debug) -----------------------------------------------
  39. #define dbg debug()
  40. #define sim template < class c
  41. #define ris return * this
  42. #define dor > debug & operator <<
  43. #define eni(x) sim > typename enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) {
  44. sim > struct rge { c b, e; }; sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
  45. sim > auto dud(c* x) -> decltype(cerr << *x, 0); sim > char dud(...);
  46. struct debug {
  47. #ifdef LOCAL
  48. ~debug() { cerr << endl; }
  49. eni(!=) cerr << boolalpha << i; ris; }
  50. eni(==) ris << range(begin(i), end(i));}
  51. sim, class b dor(pair < b, c > d) {ris << "(" << d.first << ", " << d.second << ")";}
  52. sim dor(rge<c> d) {*this << "["; for (auto it = d.b; it != d.e; ++it) *this << ", " + 2 * (it == d.b) << *it; ris << "]";}
  53. #else
  54. sim dor(const c&) { ris; }
  55. #endif
  56. };
  57. #define var(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
  58. /// ------------------------------------------------------------------------------------------------------
  59.  
  60. #ifdef LOCAL
  61.     #define nax 1000
  62.     #define qax 1000
  63. #else
  64.     #define nax 400100
  65.     #define qax 500100
  66. #endif
  67.  
  68.  
  69. int m;
  70. char S[nax];
  71. int A[nax];
  72. int Ans[qax];
  73. int sz[2];
  74.  
  75.  
  76. struct SuffixArray{
  77.   int suf[nax], cnt[nax], rnk[nax], lcp[nax];
  78.   void build(int* s, int n){
  79.     if(n<=1) return;
  80.     int m = max(n,256);
  81.     Skew(s, suf, n, m);
  82.   }
  83.   inline bool leq(int a1, int a2, int b1, int b2){return a1<b1||a1==b1&&a2<=b2;}
  84.   inline bool leq(int a1, int a2, int a3, int b1, int b2, int b3){return a1<b1||a1==b1&&leq(a2,a3,b2,b3);}
  85.   void radixPass(int* a, int* b, int* c, int n, int K){
  86.     memset(cnt, 0, ++K*sizeof(int));
  87.     for(int i=0 ; i<n ; i++) cnt[c[a[i]]]++;
  88.     for(int i=1 ; i<K ; i++) cnt[i]+=cnt[i-1];
  89.     for(int i=n ; i-- ;    ) b[--cnt[c[a[i]]]]=a[i];
  90.   }
  91.   void Skew(int* s, int* SA, int n, int K){
  92.     int n0=(n+2)/3, n1=(n+1)/3, n2=n/3, n02=n0+n2;
  93.     int* s12  = new int[n02+3];  s12[n02]= s12[n02+1]= s12[n02+2]=0;
  94.     int* SA12 = new int[n02+3]; SA12[n02]=SA12[n02+1]=SA12[n02+2]=0;
  95.     int* s0   = new int[n0];
  96.     int* SA0  = new int[n0];
  97.  
  98.     for(int i=0,j=0 ; i<n+(n0-n1) ; i++) if(i%3) s12[j++]=i;
  99.  
  100.     radixPass(s12 , SA12, s+2, n02, K);
  101.     radixPass(SA12, s12 , s+1, n02, K);  
  102.     radixPass(s12 , SA12, s  , n02, K);
  103.  
  104.     int name=0, c0=-1, c1=-1, c2=-1;
  105.     for(int i=0 ; i<n02 ; i++){
  106.       if(s[SA12[i]]!=c0 || s[SA12[i]+1]!=c1 || s[SA12[i]+2]!=c2)
  107.         name++;  c0=s[SA12[i]]; c1=s[SA12[i]+1]; c2=s[SA12[i]+2];
  108.       if(SA12[i]%3==1) s12[SA12[i]/3]=name;      
  109.       else             s12[SA12[i]/3+n0]=name;
  110.     }
  111.  
  112.     if(name<n02){
  113.       Skew(s12, SA12, n02, name);
  114.       for(int i=0 ; i<n02 ; i++) s12[SA12[i]]=i+1;
  115.     }
  116.     else for(int i=0 ; i<n02 ; i++) SA12[s12[i]-1]=i;
  117.  
  118.     for (int i=0, j=0 ; i<n02 ; i++) if(SA12[i]<n0) s0[j++]=3*SA12[i];
  119.     radixPass(s0, SA0, s, n0, K);
  120.  
  121.     #define getIdx() (SA12[t] < n0 ? SA12[t] * 3 + 1 : (SA12[t] - n0) * 3 + 2)
  122.     for(int p=0, t=n0-n1, k=0 ; k<n ; k++){
  123.       int i = getIdx();
  124.       int j = SA0[p];
  125.       if(SA12[t]<n0? leq(s[i],s12[SA12[t]+n0],  s[j],s12[j/3]) : leq(s[i],s[i+1],s12[SA12[t]-n0+1],  s[j],s[j+1],s12[j/3+n0])){
  126.         SA[k]=i; t++;
  127.         if(t==n02) for(k++ ; p<n0 ; p++,k++) SA[k]=SA0[p];
  128.       }
  129.       else{
  130.         SA[k]=j; p++;
  131.         if(p==n0) for(k++ ; t<n02 ; t++,k++) SA[k]=getIdx();
  132.       }
  133.     }
  134.     delete [] s12; delete [] SA12; delete [] SA0; delete [] s0;
  135.   }
  136.   void KasaiLCP(int *s, int n){
  137.     int k=0;
  138.     for(int i=0 ; i<n ; i++) rnk[suf[i]]=i;
  139.     for(int i=0 ; i<n ; i++)
  140.       if(rnk[i]==n-1) k=0;
  141.       else{
  142.         int j = suf[rnk[i]+1];
  143.         while( i+k<n && j+k<n && s[i+k]==s[j+k] ) k++;
  144.         lcp[rnk[i]]=k;
  145.         if(k) k--;
  146.       }
  147.   }
  148.   int& operator[](int i){return suf[i];}
  149. }Sa{};
  150.  
  151. struct SparseTable{
  152.   int n, *A, M[nax][Log2(nax)+1];
  153.   void build(int *_A, int _n){ A=_A, n=_n;
  154.     for(int i=0 ; i<n ; i++) M[i][0]=i;
  155.     for(int j=1 ; (1<<j) <= n ; j++)
  156.       for(int i=0 ; i+(1<<j)-1<n ; i++)
  157.         M[i][j] = A[M[i][j-1]] <= A[M[i+(1<<j-1)][j-1]] ? M[i][j-1] : M[i+(1<<j-1)][j-1];
  158.   }
  159.   int inline rmnq(int l, int r){
  160.     int k = Log2(r-l+1);
  161.     return A[M[l][k]] <= A[M[r-(1<<k)+1][k]] ? M[l][k] : M[r-(1<<k)+1][k];
  162.   }
  163. }St;
  164.  
  165. inline int getNext(int i, int tar){
  166.   int ans=i;
  167.   int lo=i+1;
  168.   int hi=sz[1]-1;
  169.   while(lo<=hi){
  170.     int mid = lo+hi>>1;
  171.     if(Sa.lcp[St.rmnq(i, mid-1)]>=tar) ans=mid, lo=mid+1;
  172.     else hi=mid-1;
  173.   }
  174.   return ans;
  175. }
  176.  
  177. inline int getPrev(int i, int tar){
  178.   int ans=i;
  179.   int lo=0;
  180.   int hi=i-1;
  181.   while(lo<=hi){
  182.     int mid = lo+hi>>1;
  183.     if(Sa.lcp[St.rmnq(mid, i-1)]>=tar) ans=mid, hi=mid-1;
  184.     else lo = mid+1;
  185.   }
  186.   return ans;
  187. }
  188.  
  189. struct Fenwick{
  190.   int n;
  191.   VI fn;
  192.   build(int sz){
  193.     n=sz; fn.assign(n+2, 0);
  194.   }
  195.   void clear(){
  196.     fn.assign(n+2, 0);
  197.   }
  198.   void upd(int i, int inc){
  199.     for(;i<=n;i+=i&-i) fn[i]+=inc;
  200.   }
  201.   int rsq(int i){
  202.     int sum=0;
  203.     for(;i;i-=i&-i) sum+=fn[i];
  204.     return sum;
  205.   }
  206.   int rsq(int i, int j){
  207.     return rsq(j)-(i==1?0:rsq(i-1));
  208.   }
  209. }Fn;
  210.  
  211.  
  212. int main()
  213. {
  214.   scanf("%s", S);
  215.   sz[0] = strlen(S);
  216.   S[sz[0]++] = '$';
  217.   scanf("%s", S+sz[0]);
  218.   sz[1] = sz[0] + strlen(S+sz[0]);
  219.  
  220.   for(int i=0 ; i<sz[1] ; i++) A[i]=S[i];
  221.  
  222.  
  223.   Sa.build(A, sz[1]);
  224.   Sa.KasaiLCP(A, sz[1]);
  225.  
  226.   St.build(Sa.lcp, sz[1]-1);
  227.  
  228.   vector<pair<II, II>> QryL, QryR;
  229.  
  230.   in(m);
  231.   for(int i=0 ; i<m ; i++)
  232.   {
  233.     int idx = getint-1;
  234.     int len = getint-idx;
  235.     int L = getint-1 + sz[0];
  236.     int R = getint-1 + sz[0] - len + 1;
  237.    
  238.     if(L>R) continue;
  239.  
  240.     int SaIdx = Sa.rnk[idx];
  241.     int SaL = getPrev(SaIdx, len);
  242.     int SaR = getNext(SaIdx, len);
  243.  
  244.     QryL.eb(mkpr(R, i), mkpr(SaL, SaR));
  245.     QryR.eb(mkpr(L, i), mkpr(SaL, SaR));
  246.   }
  247.  
  248.   sort(QryL.begin(), QryL.end()); reverse(QryL.begin(), QryL.end());
  249.   sort(QryR.begin(), QryR.end());
  250.  
  251.   Fn.build(sz[1]);
  252.  
  253.   for(int i=0 ; i<sz[1] ; i++)
  254.   {
  255.     Fn.upd(Sa.rnk[i]+1, +1);
  256.  
  257.     while(!QryL.empty() && QryL.back().fr.fr<=i)
  258.     {
  259.       int L = QryL.back().sc.fr;
  260.       int R = QryL.back().sc.sc;
  261.       Ans[QryL.back().fr.sc] += Fn.rsq(L+1, R+1);
  262.       QryL.pop_back();
  263.     }
  264.   }
  265.  
  266.   Fn.clear();
  267.  
  268.   for(int i=sz[1]-1 ; i>=0 ; i--)
  269.   {
  270.     Fn.upd(Sa.rnk[i]+1, +1);
  271.  
  272.     while(!QryR.empty() && QryR.back().fr.fr>=i)
  273.     {
  274.       int L = QryR.back().sc.fr;
  275.       int R = QryR.back().sc.sc;
  276.       Ans[QryR.back().fr.sc] += Fn.rsq(L+1, R+1);
  277.       Ans[QryR.back().fr.sc] -= R - L + 1;
  278.       QryR.pop_back();
  279.     }
  280.   }
  281.  
  282.   for(int i=0 ; i<m ; i++)
  283.     out(Ans[i]), LINE;
  284.  
  285. }
Advertisement
Add Comment
Please, Sign In to add comment