Codeforces #324 Div2 C Marina and Vasya(构造)
2016-04-30 00:24
399 查看
题目链接:
Codeforces #324 Div2 C Marina and Vasya
题意:
给出两个长度为n个小写英文字母字符串s1和s2,构造一个长度为n的小写字母字符串使得这个字符串
和给出的每个字符串的不相同字母个数都是t个,如果不存在这样的构造输出-1。
分析;
题意也即是构造的字符串ans要有n-t个位置分别和s1,s2相同.
假设s1和s2相同位置相同字母的个数是cnt个,不妨令构造字符串ans这cnt个位置都是和s1,s2相同的
那么ans还需要有n-cnt-t个位置和s1相同,n-cnt-t个位置和s2相同,并且这两个n-cnt-t的位置必须是不同的位置。
因为相应位置上的s1字母和s2字母是不同的。那么就需要ans字符串至少有len=t+2*(n-cnt-t)=2*n-2*cnt-t的长度。
当len>n,即n>2*cnt+t时,就肯定构造不出符合题意的字符串了。然后允许构造的话,就按照上面的方式构造即可。
Codeforces #324 Div2 C Marina and Vasya
题意:
给出两个长度为n个小写英文字母字符串s1和s2,构造一个长度为n的小写字母字符串使得这个字符串
和给出的每个字符串的不相同字母个数都是t个,如果不存在这样的构造输出-1。
分析;
题意也即是构造的字符串ans要有n-t个位置分别和s1,s2相同.
假设s1和s2相同位置相同字母的个数是cnt个,不妨令构造字符串ans这cnt个位置都是和s1,s2相同的
那么ans还需要有n-cnt-t个位置和s1相同,n-cnt-t个位置和s2相同,并且这两个n-cnt-t的位置必须是不同的位置。
因为相应位置上的s1字母和s2字母是不同的。那么就需要ans字符串至少有len=t+2*(n-cnt-t)=2*n-2*cnt-t的长度。
当len>n,即n>2*cnt+t时,就肯定构造不出符合题意的字符串了。然后允许构造的话,就按照上面的方式构造即可。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <cmath> #include <ctime> #include <cassert> #define IOS ios_base::sync_with_stdio(0); cin.tie(0) using namespace std; const int MAX_N=100010; int n,t; char s1[MAX_N],s2[MAX_N]; int ans[MAX_N]; int main() { IOS; freopen("C.in","r",stdin); while(~scanf("%d%d",&n,&t)){ scanf("%s%s",s1,s2); memset(ans,-1,sizeof(ans)); //ans[i]=0,对应字母'a' int cnt=0; for(int i=0;i<n;i++){ if(s1[i]==s2[i]){ //相同位置相同字母个数 cnt++; if(cnt<=n-t) ans[i]=s1[i]-'a'; //有可能相同字母个数多余n-t个字母 } } if(n>cnt+2*t) { //不可能的构造 printf("-1\n"); continue; } //printf("n-t-cnt=%d\n",n-t-cnt); int num=0,end=-1; for(int i=0;i<n;i++){ //从s1找n-cnt-t个位置使得ans和s1相同 if(num>=n-t-cnt) break; //num是已经找的位置的个数,>=是因为n-t-cnt可能小于0 if(ans[i]!=-1) continue; num++; ans[i]=s1[i]-'a'; //ans[i]和s1[i]相同 end=i; } num=0; for(int i=end+1;i<n;i++){ //从s2找n-cnt-t个位置使得ans和s2相同 if(num>=n-t-cnt) break; if(ans[i]!=-1) continue; num++; ans[i]=s2[i]-'a'; end=i; } for(int i=end+1;i<n;i++){ //在ans的剩余位置应是每个字母都与s1,s2的相应位置字母不同 if(ans[i]!=-1) continue; int vis[30]; memset (vis,0,sizeof(vis)); //标记s1,s2相应位置出现的字母 vis[s1[i]-'a']=vis[s2[i]-'a']=1; for(int j=0;j<30;j++){ if(!vis[j]){ ans[i]=j; break; } } } for(int i=0;i<n;i++){ printf("%c",ans[i]+'a'); } printf("\n"); } return 0; }
相关文章推荐
- JavaScript构造函数详解
- jQuery入门 构造函数
- js调用webservice构造SOAP进行身份验证
- 使用Java构造和解析Json数据的两种方法(详解二)
- 使用Java构造和解析Json数据的两种方法(详解一)
- java中的静态代码块、构造代码块、构造方法详解
- Python类方法__init__和__del__构造、析构过程分析
- 关于获得ArrayAdapter对象的细节
- 类的继承与派生
- 探讨“临时对象”(temporary object)
- Codeforces Round #197 (Div. 2)
- Codeforces Round #198 (Div. 1)
- Codeforces 405E Codeforces Round #238 (Div. 2)E
- Codeforces 407C Codeforces Round #239 (Div. 1)C
- CodeForces 449A - Jzzhu and Chocolate
- CodeForces 449 B. Jzzhu and Cities
- codeforces 618C. Constellation
- 后缀树的构造方法
- Codeforces Round #265 (Div. 2)
- Codeforces #310 div2 C. Case of Matryoshkas