답안 #793661

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
793661 2023-07-26T05:16:04 Z 박상훈(#10058) Flip it and Stick it (CCO23_day2problem1) C++17
18 / 25
4 ms 1108 KB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

constexpr int INF = 1e9 + 100;

char s[1001000], t[10], b[1001000];
int n, m;

int f(char *s){
	for (int i=1;i<=m;i++) if (s[i-1] != t[i]) return 0;
	return 1;
}

int solve(char x, char y){
	int ret = 0;

	for (int i=1;i<=n;i++){
		b[i] = x;
		if (i>=m && f(b + i-m+1)==1){
			b[i] = y;
		}

		ret += (b[i]=='1');
	}

	return ret;
}

int solve(){
	// scanf("%s", s+1);
	// scanf("%s", t+1);

	n = strlen(s+1);
	m = strlen(t+1);

	int mn = solve('0', '1'), mx = solve('1', '0');
	int cnt = 0, cnt1 = 0;
	vector<pair<int, int>> B;

	for (int i=1;i<=n-m+1;i++){
		cnt += f(s+i);

		if (m==3 && t[1]==t[2] && t[2]==t[3] && f(s+i)){
			if (B.empty() || B.back().second+1 < i) B.emplace_back(i, i);
			else B.back().second++;
		}
	} 

	int cntcnt = 0;
	for (int i=1;i<=n;i++) cnt1 += (s[i]=='1');
	for (int i=1;i<=n;i++) cntcnt += (s[i]!=t[1]);

	int fuck = 0;
	for (int i=2;i<=n-1;i++){
		if (m==3 && t[1]==t[2] && t[2]==t[3] && s[i-1]==t[1] && s[i]!=t[2] && s[i+1]==t[3]) fuck++;
	}

	if (m==3){
		if (t[1]==t[3] && t[1]!=t[2]) cnt = (cnt+1) / 2;
		
		else if (t[1]==t[2] && t[2]==t[3]){
			int cnt2 = 0;
			for (auto &[l, r]:B) cnt2 += (r-l) / 2 + 1;

			int ok = cntcnt - fuck;
			cnt = max(cnt2, cnt - ok);
		}
	}

	

	if (mn <= cnt1 && cnt1 <= mx) return cnt;
	return -1;
}

mt19937 seed(1557);
uniform_int_distribution<int> rng(0, 2147483647);
int getrand(int l, int r){return rng(seed) % (r-l+1) + l;}

int gen(){
	int n = getrand(1, 12);
	int k = getrand(0, 5);

	for (int i=1;i<=3;i++) t[i] = '0';
	t[4] = 0;
	
	for (int i=1;i<=n;i++){
		s[i] = getrand('0', '1');
		if (i>=3 && f(s+i-2)) s[i] = '1';
	} 
	s[n+1] = 0;

	for (int i=1;i<=k;i++){
		int l = getrand(1, n), r = getrand(1, n);
		if (l>r) swap(l, r);

		reverse(s+l, s+r+1);
	}

	return k;


}

int rans;
void dfs(int c, int mx){
	int flag = 0;
	for (int i=1;i<=n-m+1;i++) if (f(s+i)) {flag = 1; break;}

	if (!flag){
		rans = min(rans, c);
		return;
	}

	if (c >= min(mx, rans)) return;

	for (int i=1;i<=n;i++){
		for (int j=i+1;j<=n;j++){
			reverse(s+i, s+j+1);
			dfs(c+1, mx);
			reverse(s+i, s+j+1);
		}
	}
}

int naive(int mx){
	n = strlen(s+1);
	m = strlen(t+1);
	rans = INF;
	dfs(0, mx);
	return rans;
}

void stress(int tc){
	// printf("------------------------\n");
	// printf("Stress #%d\n", tc);

	int ans = gen();
	// printf("Input:\n");
	// printf("%s\n%s\n", s+1, t+1);

	int out = solve();

	ans = naive(ans);
	assert(ans < INF);

	// printf("Answer: %d\n", ans);
	// printf("Output: %d\n", out);

	assert(out == ans && out != -1);

	if (tc%10000==0) printf("ok %d done\n", tc);
}

int main(){
	// for (int i=1;;i++) stress(i);

	scanf("%s", s+1);
	scanf("%s", t+1);

	printf("%d\n", solve());
}

Compilation message

Main.cpp: In function 'int main()':
Main.cpp:160:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  160 |  scanf("%s", s+1);
      |  ~~~~~^~~~~~~~~~~
Main.cpp:161:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  161 |  scanf("%s", t+1);
      |  ~~~~~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 2 ms 596 KB Output is correct
4 Correct 2 ms 596 KB Output is correct
5 Correct 3 ms 596 KB Output is correct
6 Correct 2 ms 596 KB Output is correct
7 Correct 2 ms 596 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 2 ms 596 KB Output is correct
7 Correct 2 ms 596 KB Output is correct
8 Correct 2 ms 596 KB Output is correct
9 Correct 2 ms 596 KB Output is correct
10 Correct 3 ms 596 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 2 ms 596 KB Output is correct
7 Correct 2 ms 596 KB Output is correct
8 Correct 2 ms 596 KB Output is correct
9 Correct 2 ms 596 KB Output is correct
10 Correct 3 ms 596 KB Output is correct
11 Correct 1 ms 212 KB Output is correct
12 Correct 1 ms 212 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 0 ms 212 KB Output is correct
15 Correct 0 ms 212 KB Output is correct
16 Correct 0 ms 212 KB Output is correct
17 Correct 0 ms 212 KB Output is correct
18 Correct 0 ms 212 KB Output is correct
19 Correct 0 ms 212 KB Output is correct
20 Correct 2 ms 596 KB Output is correct
21 Correct 2 ms 596 KB Output is correct
22 Correct 2 ms 596 KB Output is correct
23 Correct 3 ms 596 KB Output is correct
24 Correct 3 ms 596 KB Output is correct
25 Correct 1 ms 212 KB Output is correct
26 Correct 2 ms 596 KB Output is correct
27 Correct 3 ms 596 KB Output is correct
28 Correct 3 ms 596 KB Output is correct
29 Correct 2 ms 596 KB Output is correct
30 Correct 2 ms 596 KB Output is correct
31 Correct 2 ms 596 KB Output is correct
32 Correct 3 ms 596 KB Output is correct
33 Correct 0 ms 212 KB Output is correct
34 Correct 0 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 2 ms 596 KB Output is correct
8 Correct 2 ms 596 KB Output is correct
9 Correct 3 ms 596 KB Output is correct
10 Correct 2 ms 596 KB Output is correct
11 Correct 2 ms 596 KB Output is correct
12 Correct 3 ms 656 KB Output is correct
13 Correct 2 ms 596 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 0 ms 212 KB Output is correct
10 Correct 2 ms 596 KB Output is correct
11 Correct 2 ms 596 KB Output is correct
12 Correct 3 ms 700 KB Output is correct
13 Correct 2 ms 596 KB Output is correct
14 Correct 2 ms 596 KB Output is correct
15 Correct 2 ms 596 KB Output is correct
16 Correct 2 ms 596 KB Output is correct
17 Correct 3 ms 596 KB Output is correct
18 Correct 2 ms 596 KB Output is correct
19 Correct 3 ms 596 KB Output is correct
20 Correct 2 ms 596 KB Output is correct
21 Correct 3 ms 596 KB Output is correct
22 Correct 2 ms 596 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 2 ms 596 KB Output is correct
8 Correct 2 ms 596 KB Output is correct
9 Correct 3 ms 596 KB Output is correct
10 Correct 2 ms 596 KB Output is correct
11 Correct 2 ms 596 KB Output is correct
12 Correct 3 ms 656 KB Output is correct
13 Correct 2 ms 596 KB Output is correct
14 Correct 0 ms 212 KB Output is correct
15 Correct 0 ms 212 KB Output is correct
16 Correct 0 ms 212 KB Output is correct
17 Correct 0 ms 212 KB Output is correct
18 Correct 0 ms 212 KB Output is correct
19 Correct 0 ms 212 KB Output is correct
20 Correct 0 ms 212 KB Output is correct
21 Correct 0 ms 212 KB Output is correct
22 Correct 0 ms 212 KB Output is correct
23 Correct 2 ms 596 KB Output is correct
24 Correct 2 ms 596 KB Output is correct
25 Correct 3 ms 700 KB Output is correct
26 Correct 2 ms 596 KB Output is correct
27 Correct 2 ms 596 KB Output is correct
28 Correct 2 ms 596 KB Output is correct
29 Correct 2 ms 596 KB Output is correct
30 Correct 3 ms 596 KB Output is correct
31 Correct 2 ms 596 KB Output is correct
32 Correct 3 ms 596 KB Output is correct
33 Correct 2 ms 596 KB Output is correct
34 Correct 3 ms 596 KB Output is correct
35 Correct 2 ms 596 KB Output is correct
36 Correct 0 ms 212 KB Output is correct
37 Correct 0 ms 212 KB Output is correct
38 Correct 2 ms 596 KB Output is correct
39 Incorrect 4 ms 1108 KB Output isn't correct
40 Halted 0 ms 0 KB -