比赛 EYOI与SBOI开学欢乐赛10th 评测结果 AAAWWAWWWW
题目名称 01串 最终得分 40
用户昵称 yrtiop 运行时间 0.186 s
代码语言 C++ 内存使用 78.77 MiB
提交时间 2022-10-10 21:31:16
显示代码纯文本
#include <bits/stdc++.h>
typedef long long ll;

const int maxn = 5e3 + 5;
char s[maxn],t[maxn];
int n,x,y,lst[maxn],sum[maxn],nxt[maxn];
ll dp[maxn][maxn];

ll dfs(int p,int q) {
	if(p > q)return 0;
	if(dp[p][q])return dp[p][q];
	if(s[p] == t[p]||s[q] == t[q])return 0;
	if(1ll * (q - p) * x > 1ll * y)return dp[p][q] = std::min(dfs(nxt[p] , lst[q]) + 1ll * y , dfs(p , lst[lst[q]]) + std::min(1ll * (q - lst[q]) * x , 1ll * y));
	return dp[p][q] = dfs(p , lst[lst[q]]) + 1ll * (q - lst[q]) * x;
}

void solve() {
	int res = 0,p,q;
	for(int i = 1;i <= n;++ i) {
		if(t[i - 1] != s[i - 1])lst[i] = i - 1;
		else lst[i] = lst[i - 1];
		sum[i] = sum[i - 1] + (s[i] != t[i]);
	}
	if(sum[n] == 0) {
		puts("0");
		return ;
	}
	nxt[n + 1] = n + 1;
	for(int i = n;i;-- i) {
		if(s[i + 1] != t[i + 1])nxt[i] = i + 1;
		else nxt[i] = nxt[i + 1];
	}
	p = (s[1] != t[1]) ? 1 : nxt[1];
	q = (s[n] != t[n]) ? n : lst[n];
	printf("%lld\n",dfs(p , q));
	return ;
}

int main() {
	freopen("zerone.in","r",stdin);
	freopen("zerone.out","w",stdout);
	scanf("%d %d %d",&n,&x,&y);
	scanf("%s %s",s + 1,t + 1);
	
	int tot = 0,res = 0;
	for(int i = 1;i <= n;++ i)
		tot += (s[i] ^= '0');
	for(int i = 1;i <= n;++ i)
		res += (t[i] ^= '0');
	
	if((tot - res) & 1) {
		puts("-1");
		return 0;
	}

	if(y > x) {
		solve();
		return 0;
	}
	
	res = 0;
	for(int i = 1;i <= n;++ i)
		res += s[i] ^ t[i];
	
	if(res == 2) {
		int p,q;
		for(int i = 1;i <= n;++ i) {
			if(s[i] != t[i]) {
				p = i;
				break ;
			}
		}
		for(int i = n;i;-- i) {
			if(s[i] != t[i]) {
				q = i;
				break ;
			}
		}
		if(p == q + 1)printf("%d\n",std::min(x , y << 1));
		else printf("%d\n",y);
		return 0;
	}
	
	printf("%lld\n",1ll * (res >> 1ll) * y);
	return 0;
}