求调简单树上倍增题 悬赏 2 关注
查看原帖
求调简单树上倍增题 悬赏 2 关注
377873
EricWan楼主2024/12/12 13:36

QwQ

#include <bits/stdc++.h>
#define MAXN 1000005
using namespace std;
string s;
int rk[MAXN], nrk[MAXN], n, anc[MAXN][21], sa[MAXN], h[MAXN], hs[MAXN], de[MAXN], endrk[MAXN], ansans[MAXN];
vector<int> vec[MAXN], vect;
vector<pair<vector<int>, int> > vecto[MAXN];
vector<int> ans[MAXN];
inline bool cmp(const int i, const int j)
{
	return ((endrk[anc[i][0]] != endrk[anc[j][0]]) ? (endrk[anc[i][0]] < endrk[anc[j][0]]) : (i < j));
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
	cin >> n;
	for (int i = 2; i <= n; i++)
	{
		cin >> anc[i][0];
		for (int j = 1; j <= 20; j++)
		{
			anc[i][j] = anc[anc[i][j - 1]][j - 1];
		}
	}
	cin >> s;
	s = " " + s + " ";
	for (int i = 1; i <= n; i++)
	{
		rk[i] = s[i];
		hs[i] = hs[anc[i][0]] * 131 + s[i];
		de[i] = de[anc[i][0]] + 1;
	}
	/*
	for (int i = 1; i <= n; i++)
	{
		cout << rk[i] << " ";
	}
	cout << endl;
	*/
	int k = -1;
	while (k <= 20)
	{
		k++;
		for (int i = 1; i <= n; i++)
		{
			int prk = rk[anc[i][k]];
			vec[prk].push_back(i);
			// cout << i << " -> " << prk << endl;
		}
		for (int i = 0; i <= max(n, 128); i++)
		{
			for (int j : vec[i])
			{
				// cout << j << " " << i << endl;
				vect.push_back(j);
			}
			vec[i].clear();
		}
		for (int i : vect)
		{
			// cout << i << " ";
			vec[rk[i]].push_back(i);
		}
		// cout << endl;
		vect.clear();
		int cnt = 0;
		for (int i = 0; i <= max(n, 128); i++)
		{
			for (int j = 0; j < vec[i].size(); j++)
			{
				if (j == 0 || rk[anc[vec[i][j - 1]][k]] != rk[anc[vec[i][j]][k]])
				{
					cnt++;
				}
				nrk[vec[i][j]] = cnt;
			}
			vec[i].clear();
		}
		memcpy(rk, nrk, sizeof(rk));
		/*
		for (int i = 1; i <= n; i++)
		{
			cout << rk[i] << " ";
		}
		cout << endl;
		*/
	}
	for (int i = 1; i <= n; i++)
	{
		sa[rk[i]] = i;
		// cout << rk[i] << " ";
	}
	// cout << endl;
	// for (int i = 1; i <= n; i++)
	// {
		// cout << hs[i] << "\t" << de[i] << endl;
	// }
	for (int i = 1, cnt = 0; i <= n; i++)
	{
		if (hs[sa[i]] != hs[sa[i - 1]])
		{
			vect.clear();
			// cout << de[sa[i]] << ": ";
			for (int j = i; hs[sa[j]] == hs[sa[i]]; j++)
			{
				vect.push_back(sa[j]);
				// cout << sa[j] << " ";
			}
			// cout << endl;
			vecto[de[sa[i]]].push_back({vect, i});
		}
	}
	for (int i = 1; i <= n; i++)
	{
		int cnt = 0;
		for (pair<vector<int>, int> j : vecto[i])
		{
			vector<int> now = j.first;
			sort(now.begin(), now.end(), cmp);
			for (int k : now)
			{
				endrk[k] = ++cnt;
				// cout << k << " ";
			}
			// cout << "     *" << j.second << endl;
			ans[j.second] = now;
		}
	}
	// for (int i = 1; i <= n; i++)
	// {
		// cout << sa[i] << " ";
	// }
	// cout << endl;
	// for (int i = 1; i <= n; i++)
	// {
		// cout << endrk[i] << " ";
	// }
	// cout << endl;
	// int cnt = 0;
	for (int i = 1; i <= n; i++)
	{
		for (int j : ans[i])
		{
			// ansans[j] = ++cnt;
			cout << j << " ";
		}
	}
	// for (int i = 1; i <= n; i++)
	// {
		// cout << ansans[i] << " ";
	// }
	return 0;
}
2024/12/12 13:36
加载中...