AcWing
  • 首页
  • 题库
  • 题解
  • 分享
  • 问答
  • 活动
  • 应用
  • 吐槽
  • 登录/注册

字典树



0


acwing 142 前缀统计

#include<iostream>
using namespace std;
char s[1000100];
int son[1000100][26],num[1000100],idx;
void insert(char *s)
{
    int p=0;
    for(int i=0;s[i];i++)
    {
        int &u=son[p][s[i]-'a'];
        if(!u) u=++idx;
        p=u;
    }
    num[p]++;///想问一下这个具体含义是什么/////num数组存放的是什么东西//////为什么不能写成num[p]=1
}
int find(char *s)
{
    int res=0,p=0;
    for(int i=0;s[i];i++)
    {
        int &u=son[p][s[i]-'a'];
        if(!u) break;
        p=u;res+=num[p];///这里不能写成res++?   ovo 感觉我还是没理解字典树啊啊啊
    }
    return res;
}
int main()
{
    int n,m;cin>>n>>m;
    while(n--) cin>>s,insert(s);
    while(m--)
    {
        cin>>s;
        cout<<find(s)<<endl;
    }
}


提问于2天前
Cieu
724


2 个问答



1

比如有两个同样的字符串abcd, 如果你写num[p] = 1的话,就只会把这两个字符串当成一个来计算,num[p]++是为了统计个数的

回答于2天前
哈哈_8
214

恍然大悟 明白了 –  Cieu   1天前



1

p表示当前字符串最后的那个节点编号,num[p]表示当前字符串出现的次数

回答于2天前
Anoxia_3
34933

懂了 谢谢! –  Cieu   1天前


我来回答
你确定删除吗?

© 2018-2021 AcWing 版权所有  |  京ICP备17053197号-1
联系我们  |  常见问题
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息