Aizu 2543

题意:给三个长度相等的串A,B,C,已知他们与原串的海明距离不大于d,要求还原出字典序最小的原串。

贪心。

对于原串S的每一位来说,有四种可能性:

S[i]=A

S[i]=A[i]

S[i]=B[i]

S[i]=C[i]

除此之外,三个串在第i位上有五种可能的相同:

A[i],B[i],C[i]互不相等

A[i]=B[i]

A[i]=C[i]

B[i]=C[i]

A[i]=B[i]=C[i]

分别设这五种情况的个数为tp[0..4]。

针对五种情况我们开始从前往后贪心:

注意到每一位的取舍没有前效性,我们只需要记录后缀的tp即可,每次贪心的选取字典序最小的可行解。

初始状态设三个串和原串的最大距离为dp[0..2]。

从小到大枚举当前位每一个可行字符,判断方法如下:

r[0]=dp[0]-tp[3]

r[1]=dp[1]-tp[2]

r[2]=dp[2]-tp[1]

得到r[0..2]即为第i个串经过这次决策后的最小值

显然每个值需要>=0。

然而由于三者互相约束,我们至多可以出现一个负数,这样是可以这个负数的影响消除的

1. 如果出现两个以上的负数,判断不合法

2. 由于存在tp[0]的情况,每次修改对三个串对原串的海明距离至少+2

显然需要成立:r[0]+r[1]+r[2]>=2*tp[0]

3. 每个修改至少对原串的海明距离+1

需要成立:r[0]+r[1]+r[2]-max(r) >= tp[0]

正确性显然。

综上,算法复杂度O(4*N)

#include <bits/stdc++.h>
using namespace std;
const int MAXN=100005;
char A[3][MAXN], ans[MAXN];
char v[MAXN][4];
int tp[5], dp[4], num[MAXN];
int n, d;
bool check(){for(int i=0; i<3; i++){if(dp[i]<0) return false;}int r[3]={dp[0]-tp[3],dp[1]-tp[2],dp[2]-tp[1]};int cnt=0;for(int i=0; i<3; i++) if(r[i]<0) cnt++;if(cnt>=2) return false;for(int i=0; i<3; i++) if(r[i]<0){for(int j=0; j<3; j++) if(i!=j){r[j]+=r[i];}r[i]=0;}cnt=0;for(int i=0; i<3; i++) if(r[i]<0) cnt++;if(cnt) return false;sort(r,r+3);return min((r[0]+r[1]+r[2])/2,r[0]+r[1])>=tp[0];
}
int main(){while(cin>>n>>d&&n){for(int i=0; i<3; i++){scanf("%s",A[i]);dp[i]=d;}memset(tp,0,sizeof tp);for(int i=0; i<n; i++){int s=0;for(int j=0; j<3; j++){for(int k=j+1; k<3; k++){if(A[j][i]==A[k][i]){s+=j+k;}}}s=min(s,4);num[i]=s; tp[s]++;v[i][0]='A';for(int j=0; j<3; j++){v[i][j+1]=A[j][i];}sort(v[i],v[i]+4);}for(int i=0; i<n; i++){tp[num[i]]--;for(int j=0; j<4; j++){for(int k=0; k<3; k++){if(A[k][i]!=v[i][j]){dp[k]--;}}if(check()){ans[i]=v[i][j];goto ok;}for(int k=0; k<3; k++){if(A[k][i]!=v[i][j]){dp[k]++;}}}puts("-1");goto failed;ok:;}ans[n]=0;puts(ans);failed:;}return 0;
}

AOJ 2543 Ancient Scrolls相关推荐

  1. in the java search_Search API – Using scrolls in Java - Elasticsearch Java API 手册

    Using scrolls in Java 一般搜索请求都是返回一"页"数据,无论数据量多大都一起返回给用户,Scroll API可以允许我们检索大量数据(甚至全部数据).Scro ...

  2. Ancient China Story of Shen-《Kung Fu Panda 2》

    端午假日,上海这几天时晴时雨,下午趁空去看了3D版的,剧情方面显得有些俗套,好莱坞自有其经典的三段式.出彩的是3D场景超赞,特别是Gongmen city和Lord Shen Tower的远景. 值得 ...

  3. 《算法竞赛入门经典》 例题 4-1 古老的密码(Ancient Cipher) UVa 1339

    题目描述 给定两个长度相同且不超过100的字符串,判断是否能把其中一个字符串的各个字母重排,然后对26个字母做一个一一映射,使得两个字符串相同. 例如,JWPUDJSTVP重排后可以得到WJDUPSJ ...

  4. Ancient Distance(妙啊!!!) [2020牛客暑期多校训练营(第四场)]

    Ancient Distance 给定一颗根为111有nnn个节点的树,每次可以选定树上kkk节点当作特殊节点, 定义dis(u)dis(u)dis(u)为,从u−>1u->1u−> ...

  5. 数论六之计算几何——An Easy Problem,Ancient Berland Circus,Open-air shopping malls

    可检验模板正确度 An Easy Problem?! Ancient Berland Circus Open-air shopping malls An Easy Problem?! problem ...

  6. AOJ 0525 Osenbei【穷竭搜索】

    AOJ 0525 题意: 有一个烤饼器可以烤r行c列的煎饼,煎饼可以正面朝上(用1表示)也可以背面朝上(用0表示).一次可将同一行或同一列的煎饼全部翻转.现在需要把尽可能多的煎饼翻成正面朝上,问最多能 ...

  7. 【CodeForces - 260B 】Ancient Prophesy (暴力匹配,BF算法,日期字符串)

    题干: A recently found Ancient Prophesy is believed to contain the exact Apocalypse date. The prophesy ...

  8. UVA - 1339 ​​​​​​​Ancient Cipher

    Ancient Cipher UVA - 1339 题目传送门 解决方法:模拟一下转换过程即可. AC代码: #include <cstdio> #include <iostream ...

  9. CF935D Fafa and Ancient Alphabet 概率dp(递推)

    D. Fafa and Ancient Alphabet (简洁题意请往下翻) time limit per test 2 seconds memory limit per test 256 mega ...

最新文章

  1. pytorch.forward()方法
  2. Android中AIDL的使用详解
  3. linux双屏显示不同内容,LINUX下双屏显示问题
  4. 360安全卫士核心改名ZhuDongFangYu.exe
  5. 针对以下需求提供一个解决方案:在卡牛-信用卡管家APP里面,我们的用户需要一个寻找 附近银行网点/ATM 的功能
  6. 数据迁移的应用场景与解决方案Hamal
  7. A.7链表练习题——集合的交差并
  8. 彼时彼刻恰似此时此刻
  9. Dynamics 365 CRM 接入统一身份认证平台(单点登录集成)
  10. 第四章 linux字符设备的编写一
  11. 龙测独家AI全新功能上线,手机无感录制,AI自动生成测试用例
  12. 第19章 Linux电源管理的系统架构和驱动之CPUFreq驱动
  13. 克拉克变换(Clarke Transformation)逆变换矩阵的求法
  14. Java Scanner类的方法及用法(很详细)
  15. Java开发 - 消息队列之RabbitMQ初体验
  16. ASP.NET圣贤图书馆管理系统动态网站
  17. 超参数调整的方法介绍
  18. 逆向破解之破解补丁与劫持Dll
  19. Ant Design Pro Vue使用心得
  20. Qt扫盲-QNetworkAccessManager理论总结

热门文章

  1. Java中StringBuffer的相关运用与实践
  2. 致张勇先生一封信:海底捞的“七宗罪”!
  3. win10下安装Ubuntu18.10双系统
  4. 关于计算机技能的英语作文,英文简历写作:计算机技能
  5. 今天分享的Java开源游戏项目是桌球游戏,初学者也可以用来练习喔~
  6. 天易26----java导出excel表格(支持wps和office excel)
  7. 看百度搜索的变易之道:AI引领的新搜索时代丨Xtecher 观察
  8. Windows驱动开发系列小白入门经典 - vs2019双机调试wdk驱动程序
  9. 冀教版五年级计算机教学计划,冀教版信息技术五年级下册教学计划.pdf
  10. 【微淘百课】多群直播-微信群直播