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