字典树 数组模板

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

#include
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;
}

你可能感兴趣的:(省赛准备)