【模板题】 字符串统计

传送门

题意

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

  • \((I,x)\)向集合中插入一个字符串\(x\)
  • \((Q,x)\)询问一个字符串在集合中出现了多少次。

字符仅包含小写字母

数据范围

\(1\leq N \leq 2\times 10^{4}\)
\(1 \leq |S|\leq 10^{5}\)

题解

利用字典树统计字符串数目模板题,在字典树中,每条边表示的是字符串中的字符,
在每个字符串的终止节点来计算数目

Code

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)

const int N=1e5+10;

int trie[N][26],cnt[N],tot=1;
char s[N];
int n;

void insert(char s[])
{
    int p=1;
    for(int i=0;s[i];i++)
    {
        int c=s[i]-'a';
        if(!trie[p][c]) trie[p][c]=++tot;
        p=trie[p][c];
    }
    cnt[p]++;
}

int query(char s[])
{
    int p=1;
    for(int i=0;s[i];i++) // c++字符串结尾是0
    {
        int c=s[i]-'a';
        if(!trie[p][c]) return 0;
        p=trie[p][c];
    }
    return cnt[p];
}

void solve()
{
    cin>>n;
    char op[2];
    while(n--)
    {
        cin>>op>>s;
        if(op[0]=='I')  insert(s);
        else cout<<query(s)<<endl;
    }
}
int main()
{
    solve();
}
posted @ 2020-07-27 17:20  Hyx'  阅读(129)  评论(0)    收藏  举报