Trie字符串统计


题目

维护一个字符串集合,支持两种操作:

“I x”向集合中插入一个字符串x;
“Q x”询问一个字符串在集合中出现了多少次。

共有N个操作,输入的字符串总长度不超过 10 ^ 5,字符串仅包含小写英文字母。
输入格式
第一行包含整数N,表示操作数。
接下来N行,每行包含一个操作指令,指令为”I x”或”Q x”中的一种。
输出格式
对于每个询问指令”Q x”,都要输出一个整数作为结果,表示x在集合中出现的次数。
每个结果占一行。
数据范围
1≤N≤2∗104
输入样例:
5
I abc
Q abc
Q ab
I ab
Q ab
输出样例:
1
0
1

代码

#include<iostream>
#include<cstring>
using namespace std;
const int N=100009;
int trie[N][26];
int cnt[N],idx;
  //0既表示根节点,也表示空
void insert(string s)
{
    int p=0;
    for(int i=0;s[i];i++)
    {
        int u=s[i]-'a';
        if(!trie[p][u])  trie[p][u]=++idx;
        p=trie[p][u];
    }
    cnt[p]++;
}

int query(string s)
{
    int p=0;
    for(int i=0;s[i];i++)
    {
        int u=s[i]-'a';
        if(!trie[p][u]) return 0;
        p=trie[p][u];
    }
    return cnt[p];
}

int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        string a,b;
        cin>>a>>b;
        if(a=="I") insert(b);
        else if(a=="Q") cout<<query(b)<<endl;;
    }
    return 0;
}

Author: 眼里有星星
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source 眼里有星星 !
 Previous
连通块中点的数量 连通块中点的数量
题目给定一个包含n个点(编号为1~n)的无向图,初始时图中没有边。现在要进行m个操作,操作共有三种: “C a b”,在点a和点b之间连一条边,a和b可能相等; “Q1 a b”,询问点a和点b是否在同一个连通块中,a和b可能相等; “Q2
2020-02-22
Next 
最大异或对 最大异或对
题目在给定的N个整数A1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少?输入格式第一行输入一个整数N。第二行输入N个整数A1~AN。输出格式输出一个整数表示答案。数据范围1≤N≤105,0≤Ai<231输入样例:
2020-02-22
  TOC