Luogu P2580 于是他错误的点名开始了 (Trie树模板)
Trie树就是字典树,前缀树...(无所谓啦
今天考试的时候想出来了trie树怎么写,的确是正解,然而那题爆零了(...)
还是找个trie树板子写一下吧
首先,结构体node,包括son[26]表示这个字母的编号,fin表示是否是一个单词的结尾。
插入新单词,设当前位字母为i,从根开始找,如果没有son[i]则新建节点(trie.son[i] = ++num),然后将指针指向新的节点
查询操作类似,到单词的最后一位要检查是否有fin。
*别忘了函数里字符串前的那个“*”
#include<cstdio> #include<iostream> #include<cmath> #include<cstring> using namespace std; const int maxn = 1e6+10; int n,m,num; struct node{ int son[26]; int cnt; bool fin; }trie[maxn]; void insert(char *s){ int u = 0; int len = strlen(s); for(int i = 0;i < len;i++){ int v = s[i]-'a'; if(!trie[u].son[v]) trie[u].son[v] = ++num; u = trie[u].son[v]; } trie[u].fin = true; } int query(char *s){ int u = 0; int len = strlen(s); for(int i = 0;i < len;i++){ int v = s[i]-'a'; if(!trie[u].son[v]) return 2; u = trie[u].son[v]; } if(!trie[u].fin) return 2; if(!trie[u].cnt) { trie[u].cnt++; return 1; } return 3; } int main(){ scanf("%d",&n); for(int i = 1;i <= n;i++){ char name[60] ; scanf("%s",name); insert(name); } scanf("%d",&m); for(int i = 1;i <= m;i++){ char name[60] ; scanf("%s",name); int flag = query(name); if(flag == 1) printf("OK\n"); if(flag == 2) printf("WRONG\n"); if(flag == 3) printf("REPEAT\n"); } return 0; }