链接:
https://www.nowcoder.com/acm/contest/72/B
来源:牛客网
来源:牛客网
小H在击败怪兽后,被一个密码锁挡住了去路
密码锁由N个转盘组成,编号为1~N,每个转盘有M个位置,每个位置上要么有一个小写字母,要么没有任何字符。一个密码能被转盘表示出,当且仅当指定每个转盘上面的某一个位置,然后将这些位置按照所属的转盘编号顺次连接(空位置直接忽略),可以得到这个密码
小H并没有得到任何线索,因此只能猜,她一共猜了Q次,但并不知道自己猜的密码能否被表示出来,于是她向你求助
密码锁由N个转盘组成,编号为1~N,每个转盘有M个位置,每个位置上要么有一个小写字母,要么没有任何字符。一个密码能被转盘表示出,当且仅当指定每个转盘上面的某一个位置,然后将这些位置按照所属的转盘编号顺次连接(空位置直接忽略),可以得到这个密码
小H并没有得到任何线索,因此只能猜,她一共猜了Q次,但并不知道自己猜的密码能否被表示出来,于是她向你求助
输入描述:
第1行,三个整数N,M,Q 第2~N+1行,每行一个长度为M的字符串,依次表示每个转盘上的字符 第N+2~N+Q+1行,每行一个长度不超过10000的字符串,表示小H猜的密码 2≤N,Q≤300,2≤M≤27,同一个转盘上每种字符最多出现一次
输出描述:
输出Q行,每行都是YES或NO,依次表示小H猜的每个字符串能否被表示出
#include<bits/stdc++.h>
#define M 305
using namespace std;
int n,m,q;
int mark[M][28];
int dp[M][M];//dp[i][j]表示到第i行,匹配到了第j位是否可行
int main(){
scanf("%d%d%d",&n,&m,&q);
FOR(i,1,n){
char s[M];
scanf("%s",s);
FOR(j,0,m-1){
if(s[j]=='#')mark[i][26]=1;
else mark[i][s[j]-'a']=1;
}
}
while(q--){
char s[10005];
scanf("%s",s+1);
int l=strlen(s+1);
if(l>n){
puts("NO");
continue;
}
memset(dp,0,sizeof(dp));
dp[0][0]=1;
FOR(i,1,n){//到哪一位了
FOR(j,0,l-1){//
int now=s[j+1]-'a';
if(dp[i-1][j]){
if(mark[i][now])dp[i][j+1]=1;
}
}
if(mark[i][26]){
FOR(j,0,l){
dp[i][j]|=dp[i-1][j];
}
}
}
if(dp[n][l])puts("YES");
else puts("NO");
}
return 0;
}