Advertisement
Guest User

Untitled

a guest
Jan 27th, 2020
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.38 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. #define ull unsigned long long
  4. #define fi first
  5. #define se second
  6.  
  7. using namespace std;
  8.  
  9. const int mx = 1e5+10;
  10. ll mod = 1e9+7;
  11. ll p = 257;
  12. ll P[mx];
  13. ll prP[mx];
  14.  
  15. ull q = 263;
  16. ull Q[mx];
  17. ull prQ[mx];
  18. void precalc(){
  19. prP[0] = prQ[0] = P[0] = Q[0] = 1;
  20. for(int i = 1; i < mx; i++){
  21. P[i] = (P[i-1]*p)%mod;
  22. Q[i] = Q[i-1]*q;
  23. prP[i] = (prP[i-1] + P[i])%mod;
  24. prQ[i] = prQ[i-1] + Q[i];
  25. }
  26. }
  27.  
  28. pair<ll,ull> h[mx]; //on pref
  29. pair<ll,ull> rh[mx]; //suf
  30.  
  31. void find_hashs(string s){
  32. int n = s.length();
  33. h[0].fi = 0;
  34. h[0].se = 0ull;
  35. for(int i = 1; i <= n; i++){
  36. h[i].fi = (h[i-1].fi*p + (ll)s[i-1])%mod;
  37. h[i].se = h[i-1].se*q + (ull)s[i-1];
  38. }
  39.  
  40. rh[n].fi = 0;
  41. rh[n].se = 0ull;
  42. for(int i = n-1; i >= 0; i--){
  43. rh[i].fi = (rh[i+1].fi*p + (ll)s[i])%mod;
  44. rh[i].se = rh[i+1].se*q + (ull)s[i];
  45. }
  46. }
  47.  
  48. pair<ll,ull> sub(int l, int r, bool go){
  49. if(go){
  50. pair<ll,ull> L = h[l];
  51. pair<ll,ull> R = h[r+1];
  52. L.fi = (L.fi*P[r-l+1])%mod;
  53. L.se = L.se*Q[r-l+1];
  54. return {((R.fi-L.fi)%mod+mod)%mod,R.se-L.se};
  55. }else{
  56. pair<ll,ull> L = rh[l];
  57. pair<ll,ull> R = rh[r+1];
  58. R.fi = R.fi*P[r-l+1]%mod;
  59. R.se = R.se*Q[r-l+1];
  60. return {((L.fi-R.fi)%mod+mod)%mod,L.se-R.se};
  61. }
  62. }
  63.  
  64. pair< pair<ll,ull>,pair<ll,ull> > t[4*mx];
  65. int psh[4*mx];
  66.  
  67. void build(int v, int tl, int tr){
  68. t[v] = {sub(tl,tr,1),sub(tl,tr,0)};
  69. if(tl==tr) return;
  70. int tm = (tl+tr)/2;
  71. build(v*2,tl,tm);
  72. build(v*2+1,tm+1,tr);
  73. }
  74.  
  75. pair< pair<ll,ull>,pair<ll,ull> > combine(pair< pair<ll,ull>,pair<ll,ull> > L, pair< pair<ll,ull>,pair<ll,ull> > R, int szR, int szL){
  76. ll hsh1 = (L.fi.fi*P[szR] + R.fi.fi)%mod;
  77. ull hsh2 = (L.fi.se*Q[szR] + R.fi.se);
  78. ll rhsh1 = (L.se.fi + R.se.fi*P[szL])%mod;
  79. ull rhsh2 = (L.se.se + R.se.se*Q[szL]);
  80. return {{hsh1,hsh2},{rhsh1,rhsh2}};
  81. }
  82.  
  83. void upd(int v, int tl, int tr, int val){
  84. if(val==0) return;
  85. t[v].fi = t[v].se = {(((ll)val)*prP[tr-tl])%mod,((ull)val)*prQ[tr-tl]};
  86. }
  87.  
  88. void push(int v, int tl, int tr){
  89. if(psh[v]!=0){
  90. psh[v*2] = psh[v];
  91. psh[v*2+1] = psh[v];
  92. psh[v] = 0;
  93. }
  94. int tm = (tl+tr)/2;
  95. upd(v*2,tl,tm,psh[v*2]);
  96. upd(v*2+1,tm+1,tr,psh[v*2+1]);
  97. }
  98.  
  99. pair< pair<ll,ull>,pair<ll,ull> > get(int v, int tl, int tr, int l, int r){
  100. if(tl==l && tr==r){
  101. return t[v];
  102. }
  103. push(v,tl,tr);
  104. int tm = (tl+tr)/2;
  105. if(l<=tm){
  106. if(r>=tm+1){
  107. auto L = get(v*2,tl,tm,l,tm);
  108. auto R = get(v*2+1,tm+1,tr,tm+1,r);
  109. int szR = r-(tm+1)+1;
  110. int szL = tm-l+1;
  111. return combine(L,R,szR,szL);
  112. }else{
  113. return get(v*2,tl,tm,l,r);
  114. }
  115. }else{
  116. return get(v*2+1,tm+1,tr,l,r);
  117. }
  118. }
  119.  
  120. void upd(int v, int tl, int tr, int l, int r, int num){
  121. if(l>r) return;
  122. if(tl==l && tr==r){
  123. psh[v] = num;
  124. upd(v,tl,tr,num);
  125. return;
  126. }
  127. push(v,tl,tr);
  128. int tm = (tl+tr)/2;
  129. upd(v*2,tl,tm,l,min(tm,r),num);
  130. upd(v*2+1,tm+1,tr,max(tm+1,l),r,num);
  131. int szR = tr-tm;
  132. int szL = tm-tl+1;
  133. t[v] = combine(t[v*2],t[v*2+1],szR,szL);
  134. }
  135.  
  136. main(){
  137. ios::sync_with_stdio(false);
  138. cin.tie(0);
  139. int n,q;
  140. string s;
  141. cin>>n>>q>>s;
  142. precalc();
  143. find_hashs(s);
  144. build(1,0,n-1);
  145. while(q--){
  146. string u;
  147. cin>>u;
  148. if(u[0]=='a'){
  149. int l,r;
  150. cin>>l>>r;
  151. l--;r--;
  152. auto t = get(1,0,n-1,l,r);
  153. if(t.fi==t.se){
  154. cout<<"YES"<<endl;
  155. }else{
  156. cout<<"NO"<<endl;
  157. }
  158. }else{
  159. int l,r;
  160. char c;
  161. cin>>l>>r>>c;
  162. l--;r--;
  163. upd(1,0,n-1,l,r,(int)c);
  164. }
  165. }
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement