Advertisement
Fahim_7861

segment tree string with hashing

Jan 16th, 2021
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.34 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef unsigned long long ull;
  5. typedef pair<ll,ll>pll;
  6. typedef pair<ll,pair<ll,ll>>plll;
  7. #define fastread() (ios_base:: sync_with_stdio(false),cin.tie(NULL));
  8. #define vll(v) v.begin(),v.end()
  9.  
  10. #define F first
  11. #define S second
  12.  
  13. #define pb push_back
  14. #define eb emplace_back
  15.  
  16. const int Max = 1e5 + 10;
  17. const int Mod = 1e9 + 7;
  18. const double PI =3.141592653589793238463;
  19.  
  20.  
  21. #define P1 37
  22. #define P2 29
  23. #define MOD1 1000000007
  24. #define MOD2 132021913
  25.  
  26. ll in1[Max],in2[Max];
  27.  
  28. typedef struct
  29. {
  30.  
  31. ll hash1,hash2,len;
  32.  
  33. } Node;
  34.  
  35. void make_power()
  36. {
  37. ll i,power1=1,power2=1;
  38. for(i=0; i<Max-4; i++)
  39. {
  40. in1[i]=power1;
  41. in2[i]=power2;
  42. power1 = (power1 * P1)%MOD1;
  43. power2 = (power2 * P2)%MOD2;
  44.  
  45. }
  46.  
  47. // cout<<in1[0]<<endl;
  48. }
  49.  
  50. Node Merge(Node a,Node b)
  51. {
  52. Node res;
  53. res.hash1=(a.hash1+(in1[a.len]*b.hash1)%MOD1)%MOD1;
  54.  
  55. res.hash2=(a.hash2+(in2[a.len]*b.hash2)%MOD2)%MOD2;
  56. res.len=a.len+b.len;
  57. return res;
  58. }
  59.  
  60. struct segtree
  61. {
  62.  
  63. Node tree[Max*4];
  64. string str;
  65.  
  66. void build(ll node,ll b,ll e)
  67. {
  68. if (b == e)
  69. {
  70. tree[node].hash1 = (str[b-1]*P1)%MOD1;
  71. tree[node].hash2 = (str[b-1]*P2)%MOD2;
  72. tree[node].len=1;
  73. return;
  74. }
  75. int Left = node * 2;
  76. int Right = node * 2 + 1;
  77. int mid = (b + e) / 2;
  78.  
  79.  
  80. build(Left, b, mid);
  81. build(Right, mid + 1, e);
  82. tree[node] = Merge(tree[Left],tree[Right]);
  83. }
  84.  
  85. void update(ll node, ll b, ll e, ll i, pll newvalue)
  86. {
  87. if (i > e || i < b)
  88. return;
  89. if (b >= i && e <= i)
  90. {
  91. tree[node].hash1 = (newvalue.F*P1)%MOD1;
  92. tree[node].hash2 = (newvalue.F*P2)%MOD2;
  93. tree[node].len=newvalue.S;
  94.  
  95. return;
  96. }
  97. int Left = node * 2;
  98. int Right = node * 2 + 1;
  99. int mid = (b + e) / 2;
  100. update(Left, b, mid, i, newvalue);
  101. update(Right, mid + 1, e, i, newvalue);
  102. tree[node] = Merge(tree[Left], tree[Right]);
  103. }
  104.  
  105. Node query(ll node,ll l,ll r,ll i,ll j)
  106. {
  107.  
  108. if (r < i || l > j) return {0,0,0};
  109.  
  110. if (i <= l && r <= j)
  111. {
  112. return tree[node];
  113. }
  114. ll mid = (l+r)/2;
  115. return Merge(query(node << 1, l, mid,i,j), query(node << 1 | 1, mid + 1, r,i,j));
  116. }
  117.  
  118. ll FindPos(ll node,ll l,ll r,ll pos)
  119. {
  120. if(l==r)return l;
  121.  
  122. ll mid=(l+r)/2;
  123.  
  124. if(tree[node*2].len>=pos)
  125. return FindPos(node*2,l,mid,pos);
  126.  
  127. else return FindPos( (node*2)+1,mid+1,r,pos-tree[node*2].len);
  128. }
  129.  
  130.  
  131.  
  132. } shoja,ulta;
  133.  
  134. int main()
  135. {
  136.  
  137. fastread();
  138.  
  139. ll i,j,n,m,p,a,sum=0,k,t,b,c,d,cnt=0,q,l,r,ans=0;
  140.  
  141. bool flag=false;
  142.  
  143. string str;
  144.  
  145. make_power();
  146.  
  147. cin>>str;
  148.  
  149. shoja.str=str;
  150.  
  151. reverse(vll(str));
  152. ulta.str=str;
  153.  
  154. cin>>q;
  155.  
  156. n=str.size();
  157.  
  158. shoja.build(1,1,n);
  159. ulta.build(1,1,n);
  160.  
  161.  
  162. string test,ch;
  163.  
  164. ll len=n;
  165.  
  166. // cout<<shoja.tree[1].len<<" "<<ulta.tree[1].len<<endl;
  167.  
  168. while(q--)
  169. {
  170. cin>>test;
  171.  
  172. if(test=="C")
  173. {
  174. cin>>l>>r;
  175.  
  176. ll x=shoja.FindPos(1,1,n,l);
  177. ll y=shoja.FindPos(1,1,n,r);
  178.  
  179.  
  180. ll xx=ulta.FindPos(1,1,n,len-r+1);
  181. ll yy=ulta.FindPos(1,1,n,len-l+1);
  182.  
  183. Node ans1=shoja.query(1,1,n,x,y);
  184.  
  185.  
  186. Node ans2=ulta.query(1,1,n,xx,yy);
  187.  
  188. if(ans1.hash1==ans2.hash1 && ans1.hash2==ans2.hash2)
  189. cout<<"Yes!"<<endl;
  190.  
  191. else cout<<"No!"<<endl;
  192. }
  193. else if(test=="D")
  194. {
  195. cin>>l;
  196.  
  197. pll newvalue={0,0};
  198.  
  199. ll x=shoja.FindPos(1,1,n,l);
  200. ll y=ulta.FindPos(1,1,n,len-l+1);
  201.  
  202. shoja.update(1,1,n,x,newvalue);
  203. ulta.update(1,1,n,y,newvalue);
  204.  
  205. len--;
  206. }
  207. else
  208. {
  209. cin>>l>>ch;
  210.  
  211. pll newvalue={ch[0],1};
  212.  
  213. ll x=shoja.FindPos(1,1,n,l);
  214. ll y=ulta.FindPos(1,1,n,len-l+1);
  215.  
  216. shoja.update(1,1,n,x,newvalue);
  217. ulta.update(1,1,n,y,newvalue);
  218. }
  219. }
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231. }
  232.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement