比赛 EYOI与SBOI开学欢乐赛10th 评测结果 AAAWWAWWWW
题目名称 01串 最终得分 40
用户昵称 yrtiop 运行时间 0.186 s
代码语言 C++ 内存使用 78.77 MiB
提交时间 2022-10-10 21:31:16
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. typedef long long ll;
  3.  
  4. const int maxn = 5e3 + 5;
  5. char s[maxn],t[maxn];
  6. int n,x,y,lst[maxn],sum[maxn],nxt[maxn];
  7. ll dp[maxn][maxn];
  8.  
  9. ll dfs(int p,int q) {
  10. if(p > q)return 0;
  11. if(dp[p][q])return dp[p][q];
  12. if(s[p] == t[p]||s[q] == t[q])return 0;
  13. 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));
  14. return dp[p][q] = dfs(p , lst[lst[q]]) + 1ll * (q - lst[q]) * x;
  15. }
  16.  
  17. void solve() {
  18. int res = 0,p,q;
  19. for(int i = 1;i <= n;++ i) {
  20. if(t[i - 1] != s[i - 1])lst[i] = i - 1;
  21. else lst[i] = lst[i - 1];
  22. sum[i] = sum[i - 1] + (s[i] != t[i]);
  23. }
  24. if(sum[n] == 0) {
  25. puts("0");
  26. return ;
  27. }
  28. nxt[n + 1] = n + 1;
  29. for(int i = n;i;-- i) {
  30. if(s[i + 1] != t[i + 1])nxt[i] = i + 1;
  31. else nxt[i] = nxt[i + 1];
  32. }
  33. p = (s[1] != t[1]) ? 1 : nxt[1];
  34. q = (s[n] != t[n]) ? n : lst[n];
  35. printf("%lld\n",dfs(p , q));
  36. return ;
  37. }
  38.  
  39. int main() {
  40. freopen("zerone.in","r",stdin);
  41. freopen("zerone.out","w",stdout);
  42. scanf("%d %d %d",&n,&x,&y);
  43. scanf("%s %s",s + 1,t + 1);
  44. int tot = 0,res = 0;
  45. for(int i = 1;i <= n;++ i)
  46. tot += (s[i] ^= '0');
  47. for(int i = 1;i <= n;++ i)
  48. res += (t[i] ^= '0');
  49. if((tot - res) & 1) {
  50. puts("-1");
  51. return 0;
  52. }
  53.  
  54. if(y > x) {
  55. solve();
  56. return 0;
  57. }
  58. res = 0;
  59. for(int i = 1;i <= n;++ i)
  60. res += s[i] ^ t[i];
  61. if(res == 2) {
  62. int p,q;
  63. for(int i = 1;i <= n;++ i) {
  64. if(s[i] != t[i]) {
  65. p = i;
  66. break ;
  67. }
  68. }
  69. for(int i = n;i;-- i) {
  70. if(s[i] != t[i]) {
  71. q = i;
  72. break ;
  73. }
  74. }
  75. if(p == q + 1)printf("%d\n",std::min(x , y << 1));
  76. else printf("%d\n",y);
  77. return 0;
  78. }
  79. printf("%lld\n",1ll * (res >> 1ll) * y);
  80. return 0;
  81. }