题意:k个字符串 每个字符串长度都为n.操作:交换某个字符串中任意两个位置的字符.
k<=2500,n<=5000, k*n<=5000.现在每行都要操作1次.问是否能使这k个字符串相同.无解输出-1 否则输出相同的那个字符串.
首先k个串中,任意两个串其字符出现频率都要相同,否则无解.
先算出初始第一个串和其他串得汉明距离
暴力枚举第1个串交换哪个位置.算出新的汉明距离
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");
else
swap(s[0][x],s[0][y]),cout<<s[0]<<endl;
return 0;
}