Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define ll long long
- #define ull unsigned long long
- #define fi first
- #define se second
- using namespace std;
- const int mx = 1e5+10;
- ll mod = 1e9+7;
- ll p = 257;
- ll P[mx];
- ll prP[mx];
- ull q = 263;
- ull Q[mx];
- ull prQ[mx];
- void precalc(){
- prP[0] = prQ[0] = P[0] = Q[0] = 1;
- for(int i = 1; i < mx; i++){
- P[i] = (P[i-1]*p)%mod;
- Q[i] = Q[i-1]*q;
- prP[i] = (prP[i-1] + P[i])%mod;
- prQ[i] = prQ[i-1] + Q[i];
- }
- }
- pair<ll,ull> h[mx]; //on pref
- pair<ll,ull> rh[mx]; //suf
- void find_hashs(string s){
- int n = s.length();
- h[0].fi = 0;
- h[0].se = 0ull;
- for(int i = 1; i <= n; i++){
- h[i].fi = (h[i-1].fi*p + (ll)s[i-1])%mod;
- h[i].se = h[i-1].se*q + (ull)s[i-1];
- }
- rh[n].fi = 0;
- rh[n].se = 0ull;
- for(int i = n-1; i >= 0; i--){
- rh[i].fi = (rh[i+1].fi*p + (ll)s[i])%mod;
- rh[i].se = rh[i+1].se*q + (ull)s[i];
- }
- }
- pair<ll,ull> sub(int l, int r, bool go){
- if(go){
- pair<ll,ull> L = h[l];
- pair<ll,ull> R = h[r+1];
- L.fi = (L.fi*P[r-l+1])%mod;
- L.se = L.se*Q[r-l+1];
- return {((R.fi-L.fi)%mod+mod)%mod,R.se-L.se};
- }else{
- pair<ll,ull> L = rh[l];
- pair<ll,ull> R = rh[r+1];
- R.fi = R.fi*P[r-l+1]%mod;
- R.se = R.se*Q[r-l+1];
- return {((L.fi-R.fi)%mod+mod)%mod,L.se-R.se};
- }
- }
- pair< pair<ll,ull>,pair<ll,ull> > t[4*mx];
- int psh[4*mx];
- void build(int v, int tl, int tr){
- t[v] = {sub(tl,tr,1),sub(tl,tr,0)};
- if(tl==tr) return;
- int tm = (tl+tr)/2;
- build(v*2,tl,tm);
- build(v*2+1,tm+1,tr);
- }
- 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){
- ll hsh1 = (L.fi.fi*P[szR] + R.fi.fi)%mod;
- ull hsh2 = (L.fi.se*Q[szR] + R.fi.se);
- ll rhsh1 = (L.se.fi + R.se.fi*P[szL])%mod;
- ull rhsh2 = (L.se.se + R.se.se*Q[szL]);
- return {{hsh1,hsh2},{rhsh1,rhsh2}};
- }
- void upd(int v, int tl, int tr, int val){
- if(val==0) return;
- t[v].fi = t[v].se = {(((ll)val)*prP[tr-tl])%mod,((ull)val)*prQ[tr-tl]};
- }
- void push(int v, int tl, int tr){
- if(psh[v]!=0){
- psh[v*2] = psh[v];
- psh[v*2+1] = psh[v];
- psh[v] = 0;
- }
- int tm = (tl+tr)/2;
- upd(v*2,tl,tm,psh[v*2]);
- upd(v*2+1,tm+1,tr,psh[v*2+1]);
- }
- pair< pair<ll,ull>,pair<ll,ull> > get(int v, int tl, int tr, int l, int r){
- if(tl==l && tr==r){
- return t[v];
- }
- push(v,tl,tr);
- int tm = (tl+tr)/2;
- if(l<=tm){
- if(r>=tm+1){
- auto L = get(v*2,tl,tm,l,tm);
- auto R = get(v*2+1,tm+1,tr,tm+1,r);
- int szR = r-(tm+1)+1;
- int szL = tm-l+1;
- return combine(L,R,szR,szL);
- }else{
- return get(v*2,tl,tm,l,r);
- }
- }else{
- return get(v*2+1,tm+1,tr,l,r);
- }
- }
- void upd(int v, int tl, int tr, int l, int r, int num){
- if(l>r) return;
- if(tl==l && tr==r){
- psh[v] = num;
- upd(v,tl,tr,num);
- return;
- }
- push(v,tl,tr);
- int tm = (tl+tr)/2;
- upd(v*2,tl,tm,l,min(tm,r),num);
- upd(v*2+1,tm+1,tr,max(tm+1,l),r,num);
- int szR = tr-tm;
- int szL = tm-tl+1;
- t[v] = combine(t[v*2],t[v*2+1],szR,szL);
- }
- main(){
- ios::sync_with_stdio(false);
- cin.tie(0);
- int n,q;
- string s;
- cin>>n>>q>>s;
- precalc();
- find_hashs(s);
- build(1,0,n-1);
- while(q--){
- string u;
- cin>>u;
- if(u[0]=='a'){
- int l,r;
- cin>>l>>r;
- l--;r--;
- auto t = get(1,0,n-1,l,r);
- if(t.fi==t.se){
- cout<<"YES"<<endl;
- }else{
- cout<<"NO"<<endl;
- }
- }else{
- int l,r;
- char c;
- cin>>l>>r>>c;
- l--;r--;
- upd(1,0,n-1,l,r,(int)c);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement