0
点赞
收藏
分享

微信扫一扫

【NOIP模拟】Word


Description

有k个字符串{S1,S2,…,Sk},其中的每个字符不是空格,就是26个小写英文字母中的一个。对于常数 l和d,我们的目标是从这k个字符串中得出一个(l,d)-样词,它是一个长度为l的字符串W=W[1]W[2]…W[l],它的每个字符必须符合下面的条件:
每个字符串Si(i=1,2,…,k)都有一个长度为l的子串X=X[1]X[2]…X[l],X和W的出错率小于或等于d。(X和W的出错率是(X[j],W[j])的对数,其中,X[j]<>W[j],j=1,2,…,l)
在这个任务中,给你 l,d和一组字符串;你要从中得出一个(l,d)-样词。你可以默认(l,d)-样词是存在的,而且是唯一的。
例1
如下3个字符串,相对应的(3,0)-样词是“oil”:
oil is expensive
we have three oilers
be more oily

例2
如下4个字符串,相对应的(5,1)-样词是“apple”:
you have two applas
i am an ppple
we are acples
adples are good for health

Solution

这道题就是暴力啊!
其实对于数据来说,最暴力的枚举是可以过的。我就是那样过的。
其实有更快的方法,直接枚举要变动那两个点,然后在dfs去与每个串匹配,多进行几次,这几个变动点就可以确定了。

Code

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int maxn=57;
int i,j,k,l,t,n,m,ans,d,yi,er,san,ge,shu1,shu,u,v,len[maxn],uu,vv;
char s[maxn][maxn],st[maxn],sr[maxn],ch,pan[maxn][2],pan1[maxn][2];
bool bz,az,cz,dz[maxn],ez[maxn];
int main(){
scanf("%d%d",&l,&d);
scanf("%d",&n);
fo(i,1,n){
ch=getchar();
while(ch>'z'&&ch!=' '||ch<'a'&&ch!=' ')ch=getchar();
while((ch<='z'&&ch>='a')||ch==' '){
s[i][++len[i]]=ch;
ch=getchar();
}
}
fo(i,1,26)sr[i]='a'+(i-1);
sr[27]=' ';
if(d==0){
fo(i,1,len[1]-l+1){
j=i+l-1;
az=1;
fo(k,2,n){
fo(t,1,len[k]-l+1){
yi=i;er=t;
bz=1;
fo(san,1,l){
if(s[1][yi+san-1]!=s[k][er+san-1]){bz=0;break;}
}
if(bz)break;
}
if(!bz){az=0;break;}
}
if(az){
fo(yi,i,j)putchar(s[1][yi]);
printf("\n");
return 0;
}
}
}
else if(d==1){
fo(i,1,len[1])st[i]=s[1][i];
fo(i,1,len[1]-l+1){
j=i+l-1;
fo(u,i,j){
fo(v,1,27){
az=1;
s[1][u]=sr[v];
fo(k,2,n){
fo(t,1,len[k]-l+1){
yi=i;er=t;
bz=1;d=0;
fo(san,1,l){
if(s[1][yi+san-1]!=s[k][er+san-1]){
if(d==1){bz=0;break;}
d++;
}
}
if(bz)break;
}
if(!bz){az=0;break;}
}
if(az){
fo(yi,i,j)putchar(s[1][yi]);
printf("\n");
return 0;
}
s[1][u]=st[u];
}
}
}
}
else{
fo(i,1,len[1])st[i]=s[1][i];
fo(i,1,len[1]-l+1){
j=i+l-1;
fo(u,i,j){
fo(v,1,27){
fo(uu,i+1,j)
fo(vv,1,27){
az=1;
s[1][u]=sr[v];
s[1][uu]=sr[vv];
fo(k,2,n){
fo(t,1,len[k]-l+1){
yi=i;er=t;
bz=1;d=0;
fo(san,1,l){
if(s[1][yi+san-1]!=s[k][er+san-1]){
if(d==2){bz=0;break;}
d++;
}
}
if(bz)break;
}
if(!bz){az=0;break;}
}
if(az){
fo(yi,i,j)putchar(s[1][yi]);
printf("\n");
return 0;
}
s[1][u]=st[u];
s[1][uu]=st[uu];
}
}
}
}
}
}


举报

相关推荐

0 条评论