g++内存超限,c++对了
字典树的变形。1-len-1到len-1全都入字典树,id代表不让一个字符串加两次
#include<iostream>
#include<math.h>
#include<cstdio>
#include<stdlib.h>
#include<cstring>
using namespace std;
#define MAX 26
typedef struct tirenode
{
int nCount; // 该节点前缀 出现的次数
int id;
struct tirenode *next[MAX];//该节点的后续节点
} tirenode;
tirenode memory[100000];
int allocp =0;
void intsert(tirenode *proot,char *str,int index,int id)
{
tirenode*tmp=proot;
int i=index,k;
while(str[i])
{
k=str[i]-'a';
if(tmp->next[k])
{
if(tmp->next[k]->id!=id)
{
tmp->next[k]->nCount++;
tmp->next[k]->id=id;
}
}
else
{
tirenode *creat= &memory[allocp++];
creat->nCount=1;
creat->id=id;
for(int i=0; i<MAX; i++)
creat->next[i]=NULL;
tmp->next[k]=creat;
}
tmp=tmp->next[k];
i++;
}
}
int searcht(tirenode*root,char *str)
{
if(root==NULL)
return 0;
tirenode*tmp=root;
int i=0,k;
while(str[i])
{
k=str[i]-'a';
if(tmp->next[k])
{
tmp=tmp->next[k];
}
else return 0;
i++;
}
return tmp->nCount;
}
int main()
{
tirenode *root=&memory[allocp++];
int t;
char s[27];
scanf("%d%*c",&t);
while(t--)
{
gets(s);
int len=strlen(s);
for(int i=0; i<len; i++)
intsert(root,s,i,t);
}
scanf("%d%*c",&t);
while(t--)
{
gets(s);
printf("%d\n",searcht(root,s));
}
return 0;
}