답안 #902558

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
902558 2024-01-10T17:25:31 Z qin Crossing (JOI21_crossing) C++17
26 / 100
391 ms 45736 KB
#include <bits/stdc++.h>
#define fi first
#define se second
#define ssize(x) int(x.size())
#define pn printf("\n")
#define all(x) x.begin(),x.end()
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
int inf = 2e09; ll infll = 2e18;
vector<string> get_strings(string &xx, string &y, string &z){
		string s[3] = {xx, y, z};
		int n = int(s[0].length());
		map<string, int> mp;
		queue<string> q;
		for(int l = 0; l < 3; ++l) mp[s[l]] = 1, q.emplace(s[l]);
		char t[3] = {'J', 'O', 'I'};
		//~ int cnt = 0;
		vector<string> ret;
		while(!q.empty()){
				string x = q.front(); q.pop();
				string tt = ""; tt.resize(n);
				for(int l = 0; l < 3; ++l){
						for(int i = 0; i < n; ++i) if(x[i] == s[l][i]) tt[i] = x[i];
												   else{
														int a, b;
														for(int j = 0; j < 3; ++j) if(t[j] == x[i]) a = j;
														for(int j = 0; j < 3; ++j) if(t[j] == s[l][i]) b = j;
														if(a && b) tt[i] = t[0];
														else if(max(a, b) > 1) tt[i] = t[1];
														else tt[i] = t[2];
												   }
						if(mp[tt] != 1) mp[tt] = 1, q.emplace(tt); //, cout << ":\n" << x << "\n" << s[l] << "\n" << tt << "\n\n";
				}
				//~ cout << x << "\n";
				ret.emplace_back(x);
		}
		return ret;
}
int base = 1;
struct seg{
		vector<ll> t, p, tmp, powp;
		ll mod;
		void build(int i, int s, int e){
				for(int j = s; j <= e; ++j) tmp[i] += powp[j];
				int mid = (s+e)>>1;
				if(s != e) build(i<<1, s, mid), build(i<<1|1, mid+1, e);
		}
		void init(int n, ll m){
				while(base < n) base <<= 1;
				t.resize(base<<1, 0), tmp.resize(base<<1, 0), powp.resize(base+1), p.resize(base<<1, 0);
				mod = m;
				powp[0] = 1;
				for(int i = 1; i <= base; ++i) powp[i] = powp[i-1]*mod;
				build(1, 1, base);
		}
		void add(int i, ll pr){ t[i] = tmp[i]*pr, p[i] = pr; }
		void push(int i){ if(p[i]) add(i<<1, p[i]), add(i<<1|1, p[i]), p[i] = 0; }
		void update(int i, int s, int e, int x, int y, ll pr){
				if(x <= s && e <= y) return void(add(i, pr));
				int mid = (s+e)>>1; push(i);
				if(x <= mid) update(i<<1, s, mid, x, y, pr);
				if(mid < y) update(i<<1|1, mid+1, e, x, y, pr);
				t[i] = t[i<<1]+t[i<<1|1];
		}
};
void answer(){
		int n, q; scanf("%d", &n);
		string s[3] = {"", "", ""}, t="";
		char c;
		for(int l = 0; l < 3; ++l){
				c = getchar_unlocked();
				for(int i = 0; i < n; ++i) c = getchar_unlocked(), s[l] += c;
		}
		scanf("%d\n", &q);
		for(int i = 0; i < n; ++i) c = getchar_unlocked(), t += c;
		vector<string> st = get_strings(s[0], s[1], s[2]);
		
		vector<ll> powp(n+1); powp[0] = 1;
		for(int i = 1; i <= n; ++i) powp[i] = powp[i-1]*998244353ll;
		vector<ll> powp1(n+1); powp1[0] = 1;
		for(int i = 1; i <= n; ++i) powp1[i] = powp1[i-1]*1000000007ll;
		
		unordered_map<ll, bool> mp9, mp10;
		for(string &u : st){
				ll hash = 0;
				for(int i = 0; i < n; ++i) hash += ll(u[i])*powp[i+1];
				mp9[hash] = 1;
				hash = 0;
				for(int i = 0; i < n; ++i) hash += ll(u[i])*powp1[i+1];
				mp10[hash] = 1;
				//~ printf("%lld\n", hash);
		}
		
		seg seg, seg2; seg.init(n+1, 998244353); seg2.init(n+1, 1000000007);
		for(int i = 0; i < n; ++i) seg.t[i+base] = ll(t[i])*powp[i+1];
		for(int i = base-1; i; --i) seg.t[i] = seg.t[i<<1]+seg.t[i<<1|1];
		for(int i = 0; i < n; ++i) seg2.t[i+base] = ll(t[i])*powp1[i+1];
		for(int i = base-1; i; --i) seg2.t[i] = seg2.t[i<<1]+seg2.t[i<<1|1];
		printf(mp9[seg.t[1]] && mp10[seg2.t[1]] ? "Yes\n" : "No\n");
		//~ printf("%lld\n", seg.t[1]);
		
		for(++q; --q; ){
				int a, b; 
				scanf("%d%d %c", &a, &b, &c);
				seg.update(1, 1, base, a, b, ll(c));
				seg2.update(1, 1, base, a, b, ll(c));
				printf(mp9[seg.t[1]] && mp10[seg2.t[1]] ? "Yes\n" : "No\n");
				//~ printf("%lld\n", seg2.t[1]);
		}
}
int main(){
		int T = 1;
		//~ ios_base::sync_with_stdio(0); cin.tie(0);
		for(++T; --T; ) answer();
		return 0;
}

Compilation message

Main.cpp: In function 'void answer()':
Main.cpp:68:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   68 |   int n, q; scanf("%d", &n);
      |             ~~~~~^~~~~~~~~~
Main.cpp:75:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   75 |   scanf("%d\n", &q);
      |   ~~~~~^~~~~~~~~~~~
Main.cpp:105:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  105 |     scanf("%d%d %c", &a, &b, &c);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 103 ms 7904 KB Output is correct
2 Correct 121 ms 8340 KB Output is correct
3 Correct 97 ms 4444 KB Output is correct
4 Correct 94 ms 8264 KB Output is correct
5 Correct 107 ms 8576 KB Output is correct
6 Correct 91 ms 8068 KB Output is correct
7 Correct 122 ms 8156 KB Output is correct
8 Correct 110 ms 8504 KB Output is correct
9 Correct 132 ms 8316 KB Output is correct
10 Correct 106 ms 11456 KB Output is correct
11 Correct 126 ms 8640 KB Output is correct
12 Correct 136 ms 11424 KB Output is correct
13 Correct 107 ms 8640 KB Output is correct
14 Correct 138 ms 11472 KB Output is correct
15 Correct 104 ms 8696 KB Output is correct
16 Correct 105 ms 11540 KB Output is correct
17 Correct 101 ms 8668 KB Output is correct
18 Correct 88 ms 3248 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 103 ms 7904 KB Output is correct
2 Correct 121 ms 8340 KB Output is correct
3 Correct 97 ms 4444 KB Output is correct
4 Correct 94 ms 8264 KB Output is correct
5 Correct 107 ms 8576 KB Output is correct
6 Correct 91 ms 8068 KB Output is correct
7 Correct 122 ms 8156 KB Output is correct
8 Correct 110 ms 8504 KB Output is correct
9 Correct 132 ms 8316 KB Output is correct
10 Correct 106 ms 11456 KB Output is correct
11 Correct 126 ms 8640 KB Output is correct
12 Correct 136 ms 11424 KB Output is correct
13 Correct 107 ms 8640 KB Output is correct
14 Correct 138 ms 11472 KB Output is correct
15 Correct 104 ms 8696 KB Output is correct
16 Correct 105 ms 11540 KB Output is correct
17 Correct 101 ms 8668 KB Output is correct
18 Correct 88 ms 3248 KB Output is correct
19 Correct 391 ms 42692 KB Output is correct
20 Correct 319 ms 42884 KB Output is correct
21 Correct 315 ms 45456 KB Output is correct
22 Correct 305 ms 41288 KB Output is correct
23 Correct 190 ms 14008 KB Output is correct
24 Correct 161 ms 13944 KB Output is correct
25 Correct 332 ms 45736 KB Output is correct
26 Correct 308 ms 42632 KB Output is correct
27 Correct 363 ms 45684 KB Output is correct
28 Correct 349 ms 42748 KB Output is correct
29 Correct 329 ms 45480 KB Output is correct
30 Correct 222 ms 14172 KB Output is correct
31 Correct 346 ms 45716 KB Output is correct
32 Correct 344 ms 42104 KB Output is correct
33 Correct 165 ms 13908 KB Output is correct
34 Correct 340 ms 42748 KB Output is correct
35 Correct 258 ms 41320 KB Output is correct
36 Correct 176 ms 14132 KB Output is correct
37 Correct 200 ms 14000 KB Output is correct
38 Correct 304 ms 41596 KB Output is correct
39 Correct 158 ms 40936 KB Output is correct
40 Incorrect 272 ms 40936 KB Output isn't correct
41 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 103 ms 7904 KB Output is correct
2 Correct 121 ms 8340 KB Output is correct
3 Correct 97 ms 4444 KB Output is correct
4 Correct 94 ms 8264 KB Output is correct
5 Correct 107 ms 8576 KB Output is correct
6 Correct 91 ms 8068 KB Output is correct
7 Correct 122 ms 8156 KB Output is correct
8 Correct 110 ms 8504 KB Output is correct
9 Correct 132 ms 8316 KB Output is correct
10 Correct 106 ms 11456 KB Output is correct
11 Correct 126 ms 8640 KB Output is correct
12 Correct 136 ms 11424 KB Output is correct
13 Correct 107 ms 8640 KB Output is correct
14 Correct 138 ms 11472 KB Output is correct
15 Correct 104 ms 8696 KB Output is correct
16 Correct 105 ms 11540 KB Output is correct
17 Correct 101 ms 8668 KB Output is correct
18 Correct 88 ms 3248 KB Output is correct
19 Correct 102 ms 8192 KB Output is correct
20 Correct 107 ms 4600 KB Output is correct
21 Correct 105 ms 11508 KB Output is correct
22 Correct 86 ms 7876 KB Output is correct
23 Correct 134 ms 11460 KB Output is correct
24 Correct 105 ms 8132 KB Output is correct
25 Correct 139 ms 11448 KB Output is correct
26 Correct 101 ms 8140 KB Output is correct
27 Correct 110 ms 11580 KB Output is correct
28 Correct 106 ms 8324 KB Output is correct
29 Correct 142 ms 8384 KB Output is correct
30 Correct 95 ms 7808 KB Output is correct
31 Correct 125 ms 11432 KB Output is correct
32 Correct 105 ms 11460 KB Output is correct
33 Correct 104 ms 8644 KB Output is correct
34 Correct 91 ms 8136 KB Output is correct
35 Correct 124 ms 11420 KB Output is correct
36 Correct 113 ms 8644 KB Output is correct
37 Correct 144 ms 11320 KB Output is correct
38 Correct 115 ms 8656 KB Output is correct
39 Correct 108 ms 11548 KB Output is correct
40 Correct 104 ms 8648 KB Output is correct
41 Correct 111 ms 11456 KB Output is correct
42 Correct 108 ms 8740 KB Output is correct
43 Correct 114 ms 8388 KB Output is correct
44 Correct 110 ms 8588 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 103 ms 7904 KB Output is correct
2 Correct 121 ms 8340 KB Output is correct
3 Correct 97 ms 4444 KB Output is correct
4 Correct 94 ms 8264 KB Output is correct
5 Correct 107 ms 8576 KB Output is correct
6 Correct 91 ms 8068 KB Output is correct
7 Correct 122 ms 8156 KB Output is correct
8 Correct 110 ms 8504 KB Output is correct
9 Correct 132 ms 8316 KB Output is correct
10 Correct 106 ms 11456 KB Output is correct
11 Correct 126 ms 8640 KB Output is correct
12 Correct 136 ms 11424 KB Output is correct
13 Correct 107 ms 8640 KB Output is correct
14 Correct 138 ms 11472 KB Output is correct
15 Correct 104 ms 8696 KB Output is correct
16 Correct 105 ms 11540 KB Output is correct
17 Correct 101 ms 8668 KB Output is correct
18 Correct 88 ms 3248 KB Output is correct
19 Correct 391 ms 42692 KB Output is correct
20 Correct 319 ms 42884 KB Output is correct
21 Correct 315 ms 45456 KB Output is correct
22 Correct 305 ms 41288 KB Output is correct
23 Correct 190 ms 14008 KB Output is correct
24 Correct 161 ms 13944 KB Output is correct
25 Correct 332 ms 45736 KB Output is correct
26 Correct 308 ms 42632 KB Output is correct
27 Correct 363 ms 45684 KB Output is correct
28 Correct 349 ms 42748 KB Output is correct
29 Correct 329 ms 45480 KB Output is correct
30 Correct 222 ms 14172 KB Output is correct
31 Correct 346 ms 45716 KB Output is correct
32 Correct 344 ms 42104 KB Output is correct
33 Correct 165 ms 13908 KB Output is correct
34 Correct 340 ms 42748 KB Output is correct
35 Correct 258 ms 41320 KB Output is correct
36 Correct 176 ms 14132 KB Output is correct
37 Correct 200 ms 14000 KB Output is correct
38 Correct 304 ms 41596 KB Output is correct
39 Correct 158 ms 40936 KB Output is correct
40 Incorrect 272 ms 40936 KB Output isn't correct
41 Halted 0 ms 0 KB -