CF 903 E Swapping Characters 暴力

来源:互联网 发布:phpstudy配置虚拟域名 编辑:程序博客网 时间:2024/06/05 03:28
题意:k个字符串 每个字符串长度都为n.操作:交换某个字符串中任意两个位置的字符.
k<=2500,n<=5000, k*n<=5000.现在每行都要操作1次.问是否能使这k个字符串相同.无解输出-1 否则输出相同的那个字符串.


首先k个串中,任意两个串其字符出现频率都要相同,否则无解.
先算出初始第一个串和其他串得汉明距离
暴力枚举第1个串交换哪个位置.算出新的汉明距离 

如果新得汉明距离==0或者2(字符频率相同 可以交换使得距离为0),.O(n^2*k).

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N=5e3+5,mod=1e9+7;string s[N];int k,n,rep=0,h[N];int main(){ios::sync_with_stdio(false);cin.tie(0);cin>>k>>n;for(int i=0;i<k;i++)cin>>s[i];vector<int> f(26); for(int i=0;i<n;i++)f[s[0][i]-'a']++,rep|=((f[s[0][i]-'a'])>1);bool flag=true;for(int i=1;i<k;i++){vector<int> g(26);for(int j=0;j<n;j++)g[s[i][j]-'a']++;if(f!=g)flag=false; }if(!flag){puts("-1");return 0;}for(int i=1;i<k;i++)for(int j=0;j<n;j++)h[i]+=(s[0][j]!=s[i][j]); int x=-1,y=-1;for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){bool flag=true;for(int p=1;p<k;p++){int cnt=h[p];if(s[0][i]==s[p][i])cnt++;if(s[0][j]==s[p][j])cnt++; if(s[0][i]==s[p][j])cnt--;if(s[0][j]==s[p][i])cnt--;if(!((rep&&cnt==0)||cnt==2))flag=false;}if(flag)x=i,y=j;}}if(x==-1)puts("-1");elseswap(s[0][x],s[0][y]),cout<<s[0]<<endl;return 0;} 


原创粉丝点击