88 pts MLE 求调,玄 3 关
查看原帖
88 pts MLE 求调,玄 3 关
661984
Stone_Xz楼主2024/10/21 20:34

记录,被卡空间了 QWQ

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N = 25001;

string ans, maxi = "";

int n, trie[500001][26], tot, cnt;

bool vis[500001], exist[500001];

void get_vis(string s)
{
	int cur = 0, len = s.size();
	for(int i = 0; i < len; i++)
	{
		int c = s[i] - 'a';
		cur = trie[cur][c];
		vis[cur] = true;
	}
}

void insert(string s)
{
	int cur = 0;
	for(int i = 0; i < s.size(); i++)
	{
		int c = s[i] - 'a';
		if(!trie[cur][c]) trie[cur][c] = ++ tot;
		cur = trie[cur][c];
	}
	exist[cur] = true;
}

void dfs(int cur)
{
	if(exist[cur]) {
		ans += "P";
		cnt ++;
	}
	if(cnt == n) return ;
	for(int c = 0; c <= 25; c++)
	{
		int nxt = trie[cur][c];
		if(!nxt || vis[nxt]) continue;
		ans += (char)(c + 'a');
		dfs(nxt);
		ans += "-";
	}
	for(int c = 0; c <= 25; c++)
	{
		int nxt = trie[cur][c];
		if(!nxt || !vis[nxt]) continue;
		ans += (char)(c + 'a');
		dfs(nxt);
	}
}

signed main()
{
	cin.tie(0) -> sync_with_stdio(0);
	cin >> n;
	for(int i = 1; i <= n; i++)
	{
		string tmp; cin >> tmp;
		insert(tmp);
		if(tmp.size() > maxi.size()) maxi = tmp;
	}
	get_vis(maxi);
	dfs(0);
	cout << ans.size() << "\n";
	for(int i = 0; i < ans.size(); i++)
		cout << ans[i] << "\n";
	return 0;
}
2024/10/21 20:34
加载中...