cogs 1176. [郑州101中学] 月考 字典树

1176. [郑州101中学] 月考

★★☆   输入文件:mtest.in   输出文件:mtest.out   简单对比
时间限制:1 s   内存限制:128 MB

【题目描述】

在上次的月考中Bugall同学违反了考场纪律还吃了处分,更可气的是在第二天的校会时
 间学校就此事做了全校通报. 现已知在当天校会时间有总共N个同学听到了有关Bugall的处分决定.
 
 Bugall同学在铁一有M个朋友,这M个人中有的可能听到了当天的处分决定,有的可能没
 有听到,现在Bugall同学想知道他有几个朋友听到了当天的处分通报.

【输入格式】

第一行为一个整数N,从第2行到N+1行,每行用一个长度不超过200的字符串表示
 一个人的名字.
  第N+2行为一个整数M,从第N+3行到N+M+2行,每行用一个长度不超过200的字符
 串表示Bugall同学一个朋友的名字.

【输出格式】

输出有几个Bugall同学的铁一朋友在当天的校会时间听到了Bugall处分通报.保证不重名。

【样例输入】

3
Dazui
Erge
Dapigu
2
Varpro
Erge

【样例输出】

1


#include<cstdio>
#include<cstring>
using namespace std;
struct Trie
{
    Trie* son[26];
    bool f;
    Trie()
    {
        for(int i=0;i<26;i++)
            son[i]=NULL;
        f=false;
    }
}Root;
int main()
{
    freopen("mtest.in","r",stdin);
    freopen("mtest.out","w",stdout);
    int n;
    scanf("%d",&n);    
    //cout<<n<<endl;
    while(n--)
    {
        char s[205];scanf("%s",s);
        int len=strlen(s);
        Trie* p=&Root;
        for(int i=0;i<len;i++)
        {
            int x;
            if(s[i]>='A'&&s[i]<='Z')
                x=s[i]-'A';
            else
                x=s[i]-'a';
            
            if(p->son[x]==NULL)
            {
                p->son[x]=new Trie;
            
            }
            p=p->son[x];
        }
        p->f=true;
    }

    int m;
    scanf("%d",&m);
    //cout<<m<<endl;
    int ans=0;
    while(m--)
    {
        char s[205];
        scanf("%s",s);
        int len=strlen(s);
        Trie* p=&Root;
        bool ff=true;
        for(int i=0;i<len;i++)
        {
            int x;
            if(s[i]>='A'&&s[i]<='Z')
                x=s[i]-'A';
            else
                x=s[i]-'a';
            if(p->son[x]==NULL)
            {
                ff=false;
                break;
            }
            p=p->son[x];
        }
        if(ff&&p->f)
            ans++;
    }
    printf("%d\n",ans);
    return 0;
}

上面是一个异常神奇指针做法QAQ

posted @ 2019-08-13 16:02  DreamingBligo_Tido  阅读(76)  评论(0编辑  收藏  举报