解题思路
气死了,就一个超级超级暴力的题,比赛时没打!!
超级超级暴力,选长度最短的一个字符串,处理出他所有长度为l的子串,枚举子串需要被替换的位置和用什么字母替换,每次得出一个答案判断他在其他字符串中是否成立。
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#define ll long long
#define ldb long double
using namespace std;
bool ok=1;
int l,d,k,cnt,len=2147483600,t,w[50];
char c,s[50][100],b[100],ycl[30];
bool check() {
int o=1;
for(int i=1; i<=k; i++) {
int tt=l+1;
for(int j=1; j<=w[i]-l+1; j++) {
int p=0;
for(int q=1; q<=l; q++)
if(s[i][q+j-1]!=b[q])
p++;
tt=min(tt,p);
}
if(tt>d) {
o=0;
break;
}
}
if(o)return 1;
else return 0;
}
int main() {
int bb=0;
for(int i=97; i<=122; i++)
ycl[++bb]=i;
ycl[++bb]=' ';
scanf("%d%d%d\n",&l,&d,&k);
for(int i=1; i<=k; i++) {
scanf("%c",&c);
while(c!='\n') {
s[i][++w[i]]=c;
scanf("%c",&c);
}
if(w[i]<len) {
len=w[i];
t=i;
}
}
for(int i=1; i<=w[t]-l+1; i++) {
int x=0;
for(int j=i; j<=i+l-1; j++)
b[++x]=s[t][j];
if(check()) {
for(int q=1; q<=l; q++)
printf("%c",b[q]);
return 0;
}
if(d==1) {
for(int q=1; q<=l; q++) {
ok=0;
for(int p=1; p<=bb; p++) {
if(b[q]!=ycl[p]) {
char cc=b[q];
b[q]=ycl[p];
if(check()) {
ok=1;
break;
}
b[q]=cc;
}
}
if(ok)break;
}
if(ok) {
for(int q=1; q<=l; q++)
printf("%c",b[q]);
return 0;
}
} else {
for(int q=1; q<=l; q++) {
for(int p=1; p<=bb; p++) {
if(b[q]==ycl[p]) continue;
char cc=b[q];
b[q]=ycl[p];
for(int qq=1; qq<=l; qq++) {
ok=0;
for(int pp=1; pp<=bb; pp++) {
if(b[qq]==ycl[pp]) continue;
char ss=b[qq];
b[qq]=ycl[pp];
if(check()) {
ok=1;
break;
}
b[qq]=ss;
}
if(ok)break;
}
if(ok) {
for(int kk=1; kk<=l; kk++)
printf("%c",b[kk]);
return 0;
}
b[q]=cc;
}
}
}
}
}