Educational Codeforces Round 34 (Rated for Div. 2) E. Swapping Characters(暴力)

来源:互联网 发布:学霸君答疑知乎 编辑:程序博客网 时间:2024/06/06 07:28

题目链接:http://codeforces.com/contest/903/problem/E


被这个题关了一天啊?

明显是个爆爆爆,因为最多允许有四个不同的位置,我们就暴力枚举交换就好了,我们要标记不同位置最多的那个串和当前串有多少位置不相同。然后暴力枚举就好了。

论爆爆爆姿势的重要性?


代码:

#include<bits/stdc++.h>using namespace std;const int MAXN=2505;string sv[MAXN];int cnt[30];int k,n;void getdiff(const string &a,const string &b,vector<int> &diff){for(int i=0;i<n;i++){if(a[i]!=b[i])diff.push_back(i);}}int getdiff(const string &a,const string &b){int ret=0;for(int i=0;i<n;i++){if(a[i]!=b[i])ret++;}return ret;}bool check(const string &res,const string &s){vector<int> diff;for(int i=0;i<n;i++){if(s[i]!=res[i]){diff.push_back(i);}if(diff.size()>2)return false;}if(diff.size()==1)return false;if(diff.size()==2){string tmp=s;swap(tmp[diff[0]],tmp[diff[1]]);if(tmp==res)return true;}if(diff.size()==0){memset(cnt,0,sizeof(cnt));for(int i=0;i<n;i++){cnt[s[i]-'a']++;}for(int i=0;i<=25;i++){if(cnt[i]>=2)return true;}}return false;}int main(){//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);scanf("%d%d",&k,&n);for(int i=1;i<=k;i++){cin>>sv[i];}vector<int> diff;int mx=0,id=0;for(int i=2;i<=k;i++){int tot=getdiff(sv[1],sv[i]);if(tot>mx)mx=tot,id=i;if(mx>4)return 0*puts("-1");}if(mx==0){swap(sv[1][0],sv[1][1]);return 0*printf("%s\n",sv[1].c_str());}swap(sv[2],sv[id]);getdiff(sv[1],sv[2],diff);memset(cnt,0,sizeof(cnt));for(int i=0;i<n;i++){cnt[sv[1][i]-'a']++;}for(int i=0;i<=25;i++){if(cnt[i]>=2){bool flag=true;for(int p=2;p<=k;p++){if(!check(sv[1],sv[p])){flag=false;}}if(flag)return 0*printf("%s\n",sv[1].c_str());break;}}for(int i=0;i<diff.size();i++){for(int j=i+1;j<diff.size();j++){bool flag=true;swap(sv[1][diff[i]],sv[1][diff[j]]);for(int p=2;p<=k;p++){if(!check(sv[1],sv[p])){flag=false;}}if(flag)return 0*printf("%s\n",sv[1].c_str());swap(sv[1][diff[i]],sv[1][diff[j]]);}}puts("-1");return 0;}


阅读全文
0 0
原创粉丝点击