对于这个题目,原本打算打AC自动机的,结果看了一眼数据范围,暴力码上去
对于一个串如果进行修改可以变成另外一个串,那么这两个串的长度相差 1,-1,0,然后暴力for过去,判断相同字符数量,暴力比较即可
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define re register
#define gc getchar()
#define ll long long
const int N=10010;
string s1[N],s2[N];
int main() {
freopen("y.txt","r",stdin);
int S1=1,S2=1;
while(cin>>s1[S1]) {
if(s1[S1][0]=='#') {--S1;break;}
++S1;
}
while(cin>>s2[S2]) {
if(s2[S2][0]=='#') {--S2;break;}
++S2;
}
for(int i=1;i<=S2;++i) {
int flag=0;
for(int j=1;j<=S1;++j)
if(s1[j]==s2[i]) {
cout<<s2[i]<<" is correct"<<endl;
flag=1;
break;
}
if(flag) continue;
int l=s2[i].size();
cout<<s2[i]<<":";
for(int j=1;j<=S1;++j) {
int L=s1[j].size();
if(abs(l-L)<=1) {
int ans=0;
if(l>L) {
for(int k=0,t=0;k<l;++k) {
if(s2[i][k]==s1[j][t])
++ans,++t;
}
}
else if(l<L) {
for(int k=0,t=0;k<L;++k) {
if(s1[j][k]==s2[i][t])
++ans,++t;
}
}
else {
for(int k=0,t=0;k<L;++k,++t)
if(s1[j][k]==s2[i][t])
++ans;
}
if(ans==l-(l>=L)) cout<<" "<<s1[j];
}
}
cout<<endl;
}
return 0;
}