trie树模板

问题描述

面对竞争日益激烈的社会,AK深感自己的英语水平实在是太差了,他决定在英语方面下苦工。这些日子里,AK每天都要背大量的英语单词,阅读很多英语文章。终于有一天,AK很高兴的对自己说:“我的英语已经没问题了!”他决定写一篇英语文章来显示自己的水平……

AK将自己的文章交给了他的英语老师Mr. Zhu,满以为Mr. Zhu会大加赞赏。谁知,Mr. Zhu却严厉的批评了AK。原来AK在这篇文章中拼错了许多许多单词。单词这一关都没过,别说文章的条理性了。

AK看到了自己的不足,决心从这篇文章开始重新奋斗!他首先要做的是找出文章中拼错的单词,并修正。但是这也不是一件容易的事,因为AK这篇文章写得太长了,而且拼错的单词也太多了,AK的水平太低,根本没法把拼错的单词都找出来。于是,AK找到了你,希望你帮助他完成这一任务。

输入格式

第一行一个整数N(N≤10000),表示字典中单词的个数。 第2~N+1行,每行一个单词,单词的长度不超过10。 第N+2行,列出了AK在文章中所用到的单词(一律为小写字母),单词间用空格分隔,单词的个数不会超过1000。

输出格式

一个整数,表示AK拼错的单词的数目。 注意:如果一个单词在字典中无法找到,那么我们就认为这个单词拼错了。

输入样例

2 
love 
this 
i love this game 

注意:如果出现两个相同的单词,且都拼错了,则计拼错单词数为2。

输出样例

2 

限制与约定

时间限制:1s

空间限制:128MB

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxk = 1000 + 5 ;
const int maxn = 1000000 + 10 ;
int n,cnt,ch[maxn][30],val[maxn],ans;
char a[maxk];
void insert(char *str)
{
    int len = strlen(str),u=0;
    for(int i=0;i<len;i++)
    {
        int x=str[i]-'a';
        if(!ch[u][x]) ch[u][x]=++cnt;
        u=ch[u][x];
    }
    val[u]=1;
}
int find(char *str)
{
    int len = strlen(str),u=0;
    for(int i=0;i<len;i++)
    {
        int x=str[i]-'a';
        if(!ch[u][x]) return 1;
        u=ch[u][x];
    }
    if(val[u]) return 0;
    return 1;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        scanf("%s",a);
        insert(a);
    }
    while(scanf("%s",a)!=EOF)
    {
        ans+=find(a);
    }
    cout<<ans<<endl;
    return 0;
}

 

 
源文件:answer
posted @ 2019-06-18 20:22  寒方  阅读(231)  评论(0编辑  收藏  举报