有一个疑问(玄关求答)
查看原帖
有一个疑问(玄关求答)
740311
eternal_silence楼主2025/1/15 14:18

题解中标记了最长的字符串,我标记了当前节点深度最大的一颗子树,不知道是写挂了还是思路有问题,麻烦有大佬能够指点一二。

下面是代码

#include <bits/stdc++.h>

using namespace std;

int n;
string s;
struct Trie
{
	int child[500050][26],word[500050],idex,son[500050],depth[500050],mx[500050];
	queue <char> q;
	void init()
	{
		memset(son,-1,sizeof(son));
	}
	void push(string str)
	{
		int p=0;
		for(int i=0;str[i];i++)
		{
			int t=str[i]-'a';
			if(!child[p][t])child[p][t]=++idex;
			p=child[p][t];
		}
		word[p]++;
	}
	void dfs1(int now,int father)
	{
		depth[now]=depth[father]+1;
		mx[now]=depth[now];
		for(int i=0;i<26;i++)
		{
			if(child[now][i])
			{
				dfs1(child[now][i],now);
				if(son[now]==-1||mx[child[now][i]]>mx[child[now][son[now]]])son[now]=i,mx[now]=mx[child[now][i]];
			}
		}
		return;
	}
	void dfs2(int now)
	{
		if(word[now])
		{
			n--;
			q.push('P');
		}
		for(int i=0;i<26;i++)
		{
			if(i!=son[now]&&child[now][i])
			{
				q.push(i+'a');
				dfs2(child[now][i]);
			} 
		}
		if(son[now]!=-1)q.push('a'+son[now]),dfs2(child[now][son[now]]);
		if(!n)return;
		q.push('-');
	}
	void solve()
	{
		dfs1(0,0);
		dfs2(0);
		cout<<q.size()<<endl;
		while(!q.empty())
		{
			cout<<q.front()<<endl;
			if(q.front()=='P')n--;
			q.pop();
		}
	}
}T;

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n;
	T.init();
	for(int i=1;i<=n;i++)
	{
		cin>>s;
		T.push(s);
	}
	T.solve();
	return 0;
}

2025/1/15 14:18
加载中...