题意:n个字符串,每个字符串长度为m(n*m<=5000),每个字符串必须移动两个字符串变成相同的字符串,问最后相同字符串是什么
题解:一开始hash,极限数据会T,正解是把第一个字符串看做静止不懂,对其他字符串变换两个,如果和第一个相差一个或者两个字符或者相差0个而且有重复的字符就是可行的
#include <bits/stdc++.h> #define maxn 5010 #define INF 0x3f3f3f3f using namespace std; int n, m, f[maxn], dir[maxn][30], num[maxn]; char s[maxn][maxn]; int main(){ scanf("%d%d", &n, &m); for(int i=0;i<n;i++){ scanf("%s", s[i]); for(int j=0;j<m;j++){ if(dir[i][s[i][j]-'a']) f[i] = 1; dir[i][s[i][j]-'a']++; } for(int j=0;j<26;j++){ if(dir[i][j] != dir[0][j]) return printf("-1 ")*0; } } for(int i=0;i<n;i++) for(int j=0;j<m;j++) num[i] += s[i][j]!=s[0][j]; for(int i=0;i<m;i++){ for(int j=i+1;j<m;j++){ int flag = 1; for(int k=1;k<n&&flag;k++){ int t = num[k]-(s[0][i]!=s[k][i])-(s[0][j]!=s[k][j])+(s[0][i]!=s[k][j])+(s[0][j]!=s[k][i]); if(t>2||(t==0&&!f[k])) flag = 0; } if(flag){ swap(s[0][i], s[0][j]); return 0*printf("%s ", s[0]); } } } printf("-1 "); return 0; }