Submission #1216666

#TimeUsernameProblemLanguageResultExecution timeMemory
1216666Younis_DwaiCrossing (JOI21_crossing)C++20
0 / 100
39 ms3904 KiB
//#pragma GCC optimize("Ofast,O3,unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include<bits/stdc++.h>
#define int long long
#define F first
#define S second
#define pb push_back
#define popp pop_back
#define in insert
#define endl "\n"
#define mid (l+r)/2
using namespace std;
const int N=2e5+5;
const int M=1e9+7;
mt19937 rnd(time(0));
string s,T;
int Add(int x , int y){
    x+=y;
    if(x>=M) x-=M;
    return x;
}
int Mul(int x , int y){
    x*=y;
    return x%M;
}
int Sub(int x  ,int y){
    x-=y;
    if(x<0) x+=M;
    return x;
}
int n,tree[N*4],p=rnd(),P[N],pref[N],H;
char lz[N*4];
void build(int node , int l , int r){
     lz[node]='!';
     if(l==r){
        tree[node]=Mul(P[l],T[l]-'A');
        return ;
     }
     build(node*2,l,mid);
     build(node*2+1,mid+1,r);
     tree[node]=Add(tree[node*2],tree[node*2+1]);
     return ;
}
void Val(int node , int l , int r , char c){
     tree[node]=Mul(c-'A',Sub(pref[r],pref[l-1]));
     return ;
}
void push(int node , int l , int r){
     if(lz[node]=='!') return ;
     lz[node*2]=lz[node*2+1]=lz[node];
     Val(node*2,l,mid,lz[node]);
     Val(node*2+1,mid+1,r,lz[node]);
     lz[node]='!';
     return ;
}
void upd(int node , int l , int r  ,int s , int e  , char c){
     if(l>e || r<s) return ;
     else if(l>=s && r<=e){
          lz[node]=c;
          Val(node,l,r,c);
          return ;
     }
     else{
        push(node,l,r);
        upd(node*2,l,mid,s,e,c);
        upd(node*2+1,mid+1,r,s,e,c);
        tree[node]=Add(tree[node*2],tree[node*2+1]);
     }
     return ;
}
void init(){
     P[0]=1;
     for(int i=1;i<N;i++) P[i]=Mul(P[i-1],p);
     for(int i=1;i<N;i++) pref[i]=Add(pref[i-1],P[i]);
     for(int i=1;i<=n;i++) H=Add(H,Mul(s[i]-'A',P[i]));
     build(1,1,n);
     return ;
}
int32_t main(){
    ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    cin>>n>>s>>s>>s;
    s='!'+s;
    int q;cin>>q;
    cin>>T;
    T='!'+T;
    init();
    cout<<(T==s ? "Yes"  :"No")<<endl;
    while(q--){
          int l,r;char c;
          cin>>l>>r>>c;
          upd(1,1,n,l,r,c);
          if(tree[1]==H) cout<<"Yes"<<endl;
          else cout<<"NO"<<endl;
    }
    return 0;
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...