AOJ 2543 Ancient Scrolls
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相关推荐
- in the java search_Search API – Using scrolls in Java - Elasticsearch Java API 手册
Using scrolls in Java 一般搜索请求都是返回一"页"数据,无论数据量多大都一起返回给用户,Scroll API可以允许我们检索大量数据(甚至全部数据).Scro ...
- Ancient China Story of Shen-《Kung Fu Panda 2》
端午假日,上海这几天时晴时雨,下午趁空去看了3D版的,剧情方面显得有些俗套,好莱坞自有其经典的三段式.出彩的是3D场景超赞,特别是Gongmen city和Lord Shen Tower的远景. 值得 ...
- 《算法竞赛入门经典》 例题 4-1 古老的密码(Ancient Cipher) UVa 1339
题目描述 给定两个长度相同且不超过100的字符串,判断是否能把其中一个字符串的各个字母重排,然后对26个字母做一个一一映射,使得两个字符串相同. 例如,JWPUDJSTVP重排后可以得到WJDUPSJ ...
- Ancient Distance(妙啊!!!) [2020牛客暑期多校训练营(第四场)]
Ancient Distance 给定一颗根为111有nnn个节点的树,每次可以选定树上kkk节点当作特殊节点, 定义dis(u)dis(u)dis(u)为,从u−>1u->1u−> ...
- 数论六之计算几何——An Easy Problem,Ancient Berland Circus,Open-air shopping malls
可检验模板正确度 An Easy Problem?! Ancient Berland Circus Open-air shopping malls An Easy Problem?! problem ...
- AOJ 0525 Osenbei【穷竭搜索】
AOJ 0525 题意: 有一个烤饼器可以烤r行c列的煎饼,煎饼可以正面朝上(用1表示)也可以背面朝上(用0表示).一次可将同一行或同一列的煎饼全部翻转.现在需要把尽可能多的煎饼翻成正面朝上,问最多能 ...
- 【CodeForces - 260B 】Ancient Prophesy (暴力匹配,BF算法,日期字符串)
题干: A recently found Ancient Prophesy is believed to contain the exact Apocalypse date. The prophesy ...
- UVA - 1339 Ancient Cipher
Ancient Cipher UVA - 1339 题目传送门 解决方法:模拟一下转换过程即可. AC代码: #include <cstdio> #include <iostream ...
- CF935D Fafa and Ancient Alphabet 概率dp(递推)
D. Fafa and Ancient Alphabet (简洁题意请往下翻) time limit per test 2 seconds memory limit per test 256 mega ...
最新文章
- pytorch.forward()方法
- Android中AIDL的使用详解
- linux双屏显示不同内容,LINUX下双屏显示问题
- 360安全卫士核心改名ZhuDongFangYu.exe
- 针对以下需求提供一个解决方案:在卡牛-信用卡管家APP里面,我们的用户需要一个寻找 附近银行网点/ATM 的功能
- 数据迁移的应用场景与解决方案Hamal
- A.7链表练习题——集合的交差并
- 彼时彼刻恰似此时此刻
- Dynamics 365 CRM 接入统一身份认证平台(单点登录集成)
- 第四章 linux字符设备的编写一
- 龙测独家AI全新功能上线,手机无感录制,AI自动生成测试用例
- 第19章 Linux电源管理的系统架构和驱动之CPUFreq驱动
- 克拉克变换(Clarke Transformation)逆变换矩阵的求法
- Java Scanner类的方法及用法(很详细)
- Java开发 - 消息队列之RabbitMQ初体验
- ASP.NET圣贤图书馆管理系统动态网站
- 超参数调整的方法介绍
- 逆向破解之破解补丁与劫持Dll
- Ant Design Pro Vue使用心得
- Qt扫盲-QNetworkAccessManager理论总结
热门文章
- Java中StringBuffer的相关运用与实践
- 致张勇先生一封信:海底捞的“七宗罪”!
- win10下安装Ubuntu18.10双系统
- 关于计算机技能的英语作文,英文简历写作:计算机技能
- 今天分享的Java开源游戏项目是桌球游戏,初学者也可以用来练习喔~
- 天易26----java导出excel表格(支持wps和office excel)
- 看百度搜索的变易之道:AI引领的新搜索时代丨Xtecher 观察
- Windows驱动开发系列小白入门经典 - vs2019双机调试wdk驱动程序
- 冀教版五年级计算机教学计划,冀教版信息技术五年级下册教学计划.pdf
- 【微淘百课】多群直播-微信群直播