AcWing 835. Trie字符串统计

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N][26]; //因为这题是小写的26个字母,所以我们二维写的便是26;
int idx; //idx用来统计新出现的节点的个数。
int cnt[N]; //统计字符串的次数
char str[N]; //输入的字符串
void insert(char *str)
{
    int p=0;
    for(int i=0; str[i]; i++)
    {
        int u=str[i]-'a';
        if(!a[p][u])//如果当前节点不存在,就相当于这里没有往下的路,那么就相当于我们给他创建一条路。
        {
            a[p][u]=++idx;
        }
        p=a[p][u];
    }
    cnt[p]++; /。这里可以统计当前这个字符串出现的次数
}
int  query(char *str)
{
    int p=0;
    for(int i=0; str[i]; i++)
    {
        int u=str[i]-'a';
        if(!a[p][u])
        {
            return 0;//如果这个节点的值为0,那么说明他不存在这条路,也就是说不存在这样的字符串。返回0
        }
        p=a[p][u];
    }
    return cnt[p];
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        char b;
        cin>>b;
        if(b=='Q')
        {
            cin>>str;
            cout<<query(str)<<endl;
        }
        else
        {
            cin>>str;
            insert(str);
        }

    }
    return 0;
}
原文地址:https://www.cnblogs.com/zyz010206/p/12383831.html