Spy-string
分析
这道题乍一看像是最长公共子序列,可仔细一看:同一下标。这道题瞬间简单了不少(不就是暴力吗),开始做题。
一.怎么暴力
因为是两个任意字符串的距离,所以可以直接用第一个字符串来暴力枚举所有可能的答案,然后的事情交给 check \operatorname{check} check 函数。
二. check \operatorname{check} check 函数
扫一遍所有的字符串(除了第一个),将修改过的 s 1 s_{1} s1 与 s i s_{i} si 比较,如果“距离”大于 1 1 1,直接返回 false \operatorname{false} false,全部扫完后返回 true \operatorname{true} true。
代码
#include<bits/stdc++.h>
using namespace std;
int t;
int n,m;
string s[50];
bool check(string x){
for(int i=2;i<=n;i++){//扫一遍除了第一个的所有字符串
int cont=0;
for(int j=0;j<m;j++){
if(x[j]!=s[i][j]) cont++;//记录不一样的个数
}
if(cont>1) return false;//如果“距离”大于,直接返回false
}
return true;//扫完返回true
}
int main(){
scanf("%d",&t);
while(t--){
bool flag=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) cin>>s[i];
for(int i=0;i<m;i++){//暴力枚举第i位被修改
for(char j='a';j<='z';j++){//枚举第i位修改后的
swap(s[1][i],j);//修改
if(check(s[1])){//判断是否符合要求
flag=1; //标记为符合
break;//直接跳出,不用复原
}
swap(s[1][i],j);//复原
}
if(flag) break;
}
if(flag){
cout<<s[1]<<"\n";//输出未复原的ans
}else{
printf("-1\n");//没找到输出-1
}
}
return 0;
}
完结撒花~~~