Submission #1156733

#TimeUsernameProblemLanguageResultExecution timeMemory
1156733alexander707070Crossing (JOI21_crossing)C++20
100 / 100
190 ms43808 KiB
#include<bits/stdc++.h>
#define MAXN 200007
using namespace std;

int n,l,r,q,a[MAXN];
char c;
vector<int> s[4],w;

const long long mod[2]={1000000007,1000000009};

long long power[MAXN][2];

void precalc(){
	power[0][0]=power[0][1]=1;

	for(int i=1;i<=n;i++){
		power[i][0]=(power[i-1][0]*4)%mod[0];
		power[i][1]=(power[i-1][1]*4)%mod[1];
	}
}

struct hesh{
	long long h[2]={0,0};
	int len=0;

	void add(int x){
		h[0]*=4; h[0]+=x+1; h[0]%=mod[0];
		h[1]*=4; h[1]+=x+1; h[1]%=mod[1];
		len++;
	}

	inline friend bool operator == (hesh fr,hesh sc){
		return fr.h[0]==sc.h[0] and fr.h[1]==sc.h[1];
	}

	inline friend hesh operator + (hesh fr,hesh sc){
		return { (fr.h[0]*power[sc.len][0] + sc.h[0])%mod[0] , (fr.h[1]*power[sc.len][1] + sc.h[1])%mod[1] , fr.len+sc.len };
	}
}special[3][MAXN],pref[3];

struct SegmentTree{
	hesh tree[4*MAXN];
	int lazy[4*MAXN];

	void build(int v,int l,int r){
		if(l==r)tree[v].add(a[l]);
		else{
			int tt=(l+r)/2;

			build(2*v,l,tt);
			build(2*v+1,tt+1,r);

			tree[v]=tree[2*v]+tree[2*v+1];
		}
	}

	void psh(int v){
		if(lazy[v]==0)return;

		tree[2*v]=special[lazy[v]-1][tree[2*v].len];
		tree[2*v+1]=special[lazy[v]-1][tree[2*v+1].len];

		lazy[2*v]=lazy[2*v+1]=lazy[v];
		lazy[v]=0;
	}

	void update(int v,int l,int r,int ll,int rr,int val){
		if(ll>rr)return;
		if(l==ll and r==rr){
			tree[v]=special[val][tree[v].len];
			lazy[v]=val+1;
		}else{
			int tt=(l+r)/2;
			psh(v);

			update(2*v,l,tt,ll,min(tt,rr),val);
			update(2*v+1,tt+1,r,max(tt+1,ll),rr,val);

			tree[v]=tree[2*v]+tree[2*v+1];
		}
	}
}seg;

int val(char c){
	if(c=='J')return 0;
	if(c=='O')return 1;
	if(c=='I')return 2;
}

vector<hesh> vals;

hesh calc(vector<int> s){

	hesh res;
	for(int i=0;i<n;i++)res.add(s[i]);

	return res;
}

void dumb(){
	for(int i=0;i<3;i++){
		for(int f=0;f<3;f++){
			for(int k=0;k<3;k++){

				if(i+f+k==1 or i+f+k==4){
					for(int d=0;d<n;d++)w.push_back((i*s[1][d]+f*s[2][d]+k*s[3][d])%3);
					vals.push_back(calc(w));
					w.clear();
				}

			}
		}
	}
}

void query(){
	hesh curr=seg.tree[1];

	for(auto z:vals){
		if(z==curr){
			cout<<"Yes\n";
			return;
		}
	}

	cout<<"No\n";
}

int main(){

	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin>>n;
	for(int i=1;i<=3;i++){
		for(int f=1;f<=n;f++){
			cin>>c;
			s[i].push_back(val(c));
		}
	}

	precalc();
	dumb();

	for(int i=1;i<=n;i++){
		for(int f=0;f<3;f++)pref[f].add(f);
		for(int f=0;f<3;f++)special[f][i]=pref[f];
	}

	cin>>q;
	for(int i=1;i<=n;i++){
		cin>>c;
		a[i]=val(c);
	}

	seg.build(1,1,n);
	query();

	for(int i=1;i<=q;i++){
		cin>>l>>r>>c;

		seg.update(1,1,n,l,r,val(c));
		query();
	}

	return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int val(char)':
Main.cpp:88:1: warning: control reaches end of non-void function [-Wreturn-type]
   88 | }
      | ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...