关于字典树
  • 板块学术版
  • 楼主封禁用户
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/7/17 22:09
  • 上次更新2023/10/27 19:48:09
查看原帖
关于字典树
365654
封禁用户楼主2022/7/17 22:09
// ...
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 数组会发生什么?

2022/7/17 22:09
加载中...