【gmoj】【暴力】 word
题目
解题思路
找出长度最短的一个字符串
枚举出它所有长度为l的字符串
枚举需要修改的位置和修改后的字符
判断这个字符串是否符合
代码
#include<iostream>
#include<cstdio>
using namespace std;
struct lzf{
string s;
}f[52];
string w,x,y,z;
int l,d,n,len[52],ans=0;
bool check(string x) //判断是否符合,每个字符串至少有一个子串与答案不一样的位数<=d
{
for (int i=1;i<=n;i++)
{
int p=0;
for (int j=l-1;j<len[i];j++)
{
z=f[i].s.substr(j-l+1,l);
int c=0;
for (int k=0;k<l;k++)
if (z[k]!=x[k])
c++;
if (c<=d)
{
p=1;
break;
}
}
if (!p) return false;
}
return true;
}
void solve(int j)
{
for (int k=0;k<26;k++)
{
x=y;
if (y[j]!=k+97)
{
x[j]=k+97;
if (check(x))
{
cout<<x<<endl;
ans=1;
return;
}
}
}
}
int main()
{
scanf("%d%d",&l,&d);
scanf("%d",&n);
getline(cin,f[1].s);
for (int i=1;i<=n;i++)
{
getline(cin,f[i].s);
len[i]=f[i].s.size();
if (len[i]<len[1])
{
swap(len[i],len[1]);
swap(f[i],f[1]);
}
}
for (int i=l-1;i<len[1];i++)
{
x=f[1].s.substr(i-l+1,l);
w=x,y=x;
if (check(x)) //不修改
{
cout<<x;
return 0;
}
if (d>=1)
{
for (int j=0;j<l;j++) //修改一个位置
{
x=w;
solve(j);
if (ans) return 0;
}
}
if (d==2)
{
for (int j=0;j<l;j++) //修改第一个位置
for (int k=0;k<26;k++)
{
x=w;
if (w[j]!=k+97)
{
x[j]=k+97;
y=x;
for (int r=0;r<l;r++) //修改第二个位置
if (r!=j)
{
solve(r);
if (ans) return 0;
}
}
}
}
}
return 0;
}