思路:
直接暴力枚举子串,然后dfs更改
c o d e code code
#include<iostream>
#include<cstdio>
using namespace std;
int l, d, n, a[100];
char s[35][100];
char b[100];
bool flag;
void dfs(int x, int y)
{
flag=0;
for(int i=1; i<=n; i++)
{
int minn=l+1;
for(int j=1; j<=a[i]-l+1; j++)
{
int t=0;
for(int k=1; k<=l; k++)
if(b[k]!=s[i][j+k-1])
t++;
minn=min(minn, t);
}
if(minn>d)
{
flag=1;
break;
}
}
if(!flag)
return;
if(y>d)
return;
for(int i=x; i<=l; i++)
{
char ch=b[i];
for(char c='a'; c<='z'; c++)
{
if(ch==c)
continue;
b[i]=c;
dfs(i+1, y+1);
if(!flag)
return;
b[i]=ch;
}
if(b[i]==' ')
continue;
b[i]=' ';
dfs(i+1, y+1);
if(!flag)
return;
b[i]=ch;
}
}
int main()
{
scanf("%d%d%d\n", &l, &d, &n);
for(int i=1; i<=n; i++)
{
char ch;
scanf("%c", &ch);
while(ch!='\n')
{
s[i][++a[i]]=ch;
scanf("%c", &ch);
}
}
for(int i=1; i<=a[1]-l+1; i++)
{
for(int j=i; j<=i+l-1; j++)
b[j-i+1]=s[1][j];
dfs(1, 1);
if(!flag)
break;
}
for(int i=1; i<=l; i++)
printf("%c", b[i]);
return 0;
}