思路:
先输入三个整数和 D 个单词;
重复 N 次:
- 输入一个字符串 T;
- 处理字符串:用一个二维数组 G,用于记录每一位有哪些字母可以用,然后遍历字符串,如遇
(则重复将后面的所有字符统计到这一位,直到遇到)为止,否则直接将该字符统计到这一位即可; - 遍历每一个单词,如果该单词的每一位都是可用字母,那么 ans + 1;
- 输出;
AC code:
#include<bits/stdc++.h>
using namespace std;
int l,d,n,s,ans;
string t,a[5005];
bool g[505][30],q;
int main()
{
cin>>l>>d>>n;
for(int i=1;i<=d;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
cin>>t;
//初始化变量和数组
s=0; //位数
ans=0; //答案
memset(g,false,sizeof(g));
for(int j=0;j<t.size();j++)
{
if(t[j]=='(') //遇到括号时
{
while(t[++j]!=')')//重复直到遇到右括号
{
//设置为true(可用)
g[s][t[j]-'a']=true;
}
s++; //注意是在同一位上,需要等括号内内容统计完再让位数+1
}
else
{
//直接设置一个字母为true(可用)
g[s++][t[j]-'a']=true;
}
}
for(int j=1;j<=d;j++)
{
q=true; //标记
for(int k=0;k<l;k++)
{
if(!g[k][a[j][k]-'a'])
{
q=false;
break; //不符合直接退出
}
}
if(q)
{
ans++; //答案+1
}
}
//输出
cout<<"Case #"<<i<<": "<<ans<<endl;
}
return 0;
}