// ...
const int N=3000012;
const int M=3000012;
char word[M];
stack <int> s;
struct Side
{
int to;
int next_side;
};
struct Fdlks
{
int first[N];
Side sds[M];
int m;
void init()
{
m=0;
memset(sds,0,sizeof sds);
memset(first,-1,sizeof first);
for(int i=1;i<=m;++i)
sds[i].next_side=-1;
}
void add_drct(int from,int to)
{
++m;
sds[m].to=to;
sds[m].next_side=first[from];
first[from]=m;
}
};
struct Sts
{
char c[N];
int data[N];
int ts;
Fdlks tos;
inline void init()
{
tos.first[1]=-1;
data[1]=0;
}
void add()
{
s.push(1);
int len=strlen(word);
int now=1;
for(int j=0;j<len;++j)
{
int i=tos.first[now];
while(i!=-1)
{
if(c[tos.sds[i].to]==word[j]) break;
i=tos.sds[i].next_side;
}
if(i==-1)
{
++ts;
tos.add_drct(now,ts);
c[ts]=word[j];
now=ts;
}
else now=tos.sds[i].to;
s.push(now);
}
while(!s.empty())
{
++data[s.top()];
s.pop();
}
}
int get()
{
int len=strlen(word);
int now=1;
for(int j=0;j<len;++j)
{
int i=tos.first[now];
while(i!=-1)
{
if(c[tos.sds[i].to]==word[j]) break;
i=tos.sds[i].next_side;
}
if(i==-1) return 0;
else now=tos.sds[i].to;
}
return data[now];
}
}sts;
int main()
{
sts.ts=1;
sts.tos.init();
// ...
while(t--)
{
sts.init();
// ...
}
return 0;
}
rt(P8306)。用链式前向星代替 Trie 数组会发生什么?