下面我们以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;
}