LOADING

加载过慢请开启缓存 浏览器默认开启

P13428 [GCJ 2009 Qualification] Alien Language 题解

2025/9/20

题目传送门


思路:

先输入三个整数和 D 个单词;

重复 N 次:

  1. 输入一个字符串 T;
  2. 处理字符串:用一个二维数组 G,用于记录每一位有哪些字母可以用,然后遍历字符串,如遇 ( 则重复将后面的所有字符统计到这一位,直到遇到 ) 为止,否则直接将该字符统计到这一位即可;
  3. 遍历每一个单词,如果该单词的每一位都是可用字母,那么 ans + 1;
  4. 输出;

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;
}