字典树 数组模板

下面我们以HDU1521(统计前缀)为例
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1251
指针代码:(C++提交可以通过,G++MLE,听大佬们说是G++在申请指针内存的同时也会申请一个指针对应类型大小的内存,这样消耗内存可能就是原来的两倍了

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int trie[maxn][26];//字符位置
int num[maxn];//计数
int pos=1;
void Insert(string s)
{
     int p=0;//节点位置
     for(int i=0;s[i];i++)
     {
          int id=s[i]-'a';
          if(trie[p][id]==0) trie[p][id]=pos++;//如过没有p到id的前缀,则为节点编号
          p=trie[p][id];//修改位置
          num[p]++;//前缀数量
     }
//num[p]++;单词数量++
}
int Search(string s)
{
     int p=0;
     for(int i=0;s[i];i++)
     {
          int id=s[i]-'a';
          if(trie[p][id]==0) return 0;//没有找到p到id的前缀
          p=trie[p][id];//继续向下找
     }
     return num[p];
}
int main()
{
     char s[12];
     /*
     这里输入主要是判断空行,因为cin、scanf输入时候检测空格自动停止读取
     也可以用cin.getline(s,12)读入,然后看看s长度是否为0
     */
     while(gets(s))
     {
          if(s[0]==NULL) break;
          Insert(s);
     }
     while(gets(s)) printf("%d\n",Search(s));
     return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值