제출 #1213782

#제출 시각아이디문제언어결과실행 시간메모리
1213782mychecksedadCrossing (JOI21_crossing)C++20
100 / 100
576 ms24976 KiB
/* Author : Mychecksdead */ #include<bits/stdc++.h> using namespace std; #define ll long long int #define MOD (1000000000+7) #define MOD1 (998244353) #define pb push_back #define all(x) x.begin(), x.end() #define en cout << '\n' #define ff first #define ss second #define pii pair<int,int> #define vi vector<int> #define cerr if(false) cerr const int N = 1e6+100, M = 1e5+10, K = 52, MX = 30; int n, q, lazy[N]; string A, B, C, TT; int id[500]; ll p[N], T[N], dp[4][N]; int get(int c, int len){ return dp[c][len]; } void build(int l, int r, int k){ lazy[k] = 0; if(l == r){ T[k] = id[TT[l - 1]]; return; } int mid = l+r>>1; build(l, mid, k<<1); build(mid+1, r, k<<1|1); T[k] = (T[k<<1] + T[k<<1|1] * p[mid - l + 1]) % MOD; } void push(int k, int l, int r){ if(lazy[k] != 0){ int mid = l+r>>1; lazy[k<<1] = lazy[k]; lazy[k<<1|1] = lazy[k]; T[k<<1] = get(lazy[k], mid - l + 1); T[k<<1|1] = get(lazy[k], r - mid); lazy[k] = 0; } } void upd(int l, int r, int ql, int qr, int k, int c){ if(ql > r || l > qr) return; if(ql <= l && r <= qr){ lazy[k] = c; T[k] = get(c, r - l + 1); return; } int mid = l+r>>1; push(k, l, r); upd(l, mid, ql, qr, k<<1, c); upd(mid+1, r, ql, qr, k<<1|1, c); T[k] = (T[k<<1] + T[k<<1|1] * p[mid - l + 1]) % MOD; } ll H(string &s){ ll h = 0; for(int i = 1; i <= n; ++i){ h = (h + (id[s[i-1]] * p[i-1])) % MOD; } return h; } string cross(string &x, string &y){ string t; for(int i = 0; i < n; ++i){ char other; if(x[i] != 'J' && y[i] != 'J') other = 'J'; if(x[i] != 'O' && y[i] != 'O') other = 'O'; if(x[i] != 'I' && y[i] != 'I') other = 'I'; t += (x[i] == y[i] ? x[i] : other); } return t; } vector<string> SP; map<int, bool> VIS; void process(){ for(int i = 1; i < SP.size(); ++i){ for(int j = 0; j < i; ++j){ string t = cross(SP[i], SP[j]); int h = H(t); if(VIS[h] == 0){ VIS[h] = 1; SP.pb(t); } } } for(auto s: SP) cerr << s << '\n'; } void solve(){ cin >> n >> A >> B >> C >> q >> TT; id['J'] = 1; id['O'] = 2; id['I'] = 3; p[0] = 1; for(int i = 1; i <= n; ++i){ p[i] = (p[i - 1] * 7) % MOD; } for(int j = 1; j <= 3; ++j){ dp[j][0] = 0; for(int i = 1; i <= n; ++i){ dp[j][i] = (dp[j][i - 1] + p[i-1] * j) % MOD; } } SP.pb(A); SP.pb(B); SP.pb(C); VIS[H(A)] = VIS[H(B)] = VIS[H(C)] = 1; process(); build(1, n, 1); if(VIS[T[1]]) cout << "Yes\n"; else cout << "No\n"; for(int i = 1; i <= q; ++i){ int l, r; char c; cin >> l >> r >> c; upd(1, n, l, r, 1, id[c]); if(VIS[T[1]]) cout << "Yes\n"; else cout << "No\n"; } } int main(){ cin.tie(0); ios::sync_with_stdio(0); int tt = 1, aa; // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); while(tt--){ solve(); } cerr<<"time taken : "<<(float)clock()/CLOCKS_PER_SEC<<" seconds\n"; 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...