Trie树
Trie:用来高效存储和查找的字符串集合,从根节点开始依次存储字符串的各个字符, 并在最后一个字符中做出标记表示 以此结束是一个字符串。
例题:
测试样例:
5 I abc Q abc Q ab I ab Q ab
预期输出:
1 0 1
代码实现:
#include<bits/stdc++.h> using namespace std; const int N =1e5+10; int son[N][26];//题目只存储小写字母,故一个结点最多有26个边 int cnt[N] ,idx;//cnt[]存储某个节点的标记,表示有多少个以此结尾。idx表示当前下标 char str[N];//每次输入的字符; void insert(char str[]){int p=0;for(int i=0;i<strlen(str);i++){int u =str[i]-'a';if(!son[p][u]) son[p][u]= ++idx; //这里的P指的是第几个节点,按插入顺序确定的,u表示的是这个节点存储的字符。p=son[p][u];}cnt[p] ++; //循环结束时p表示的节点就是一个字符完成的节点。 } int query(char str[]){int p=0;for(int i=0;i<strlen(str);i++){int u= str[i] - 'a';if(!son[p][u]) return 0;p=son[p][u];}return cnt[p]; } int main() {int n;cin>>n;while(n--){char op[2];scanf("%s%s",op,str);if(op[0]== 'I') insert(str);else cout<<query(str)<<endl;} }