Codeforces903E Swapping Characters

题意: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;
}
原文地址:https://www.cnblogs.com/Noevon/p/8676063.html