80分求助
  • 板块P2814 家谱
  • 楼主Flying_Eagle
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/12/22 19:27
  • 上次更新2023/10/24 06:55:49
查看原帖
80分求助
757409
Flying_Eagle楼主2022/12/22 19:27

最后两个点TLE

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

struct node {
	string name;
	int fa;
};
node a[50009];

int find(int i) {
	if (a[i].fa != i)
		a[i].fa = find(a[i].fa);
	return a[i].fa;
}

void merge(int r, int t) {
	int q = find(t);
	if (r != q)
		a[q].fa = r;
}

int main() {
	char c;
	int tot = 0;
	int fa;
	string s;
	do {
		cin >> c;
		if (c == '$')
			break;
		cin >> s;
		int r = -1;
		for (int i = 1; i <= tot; i++)
			if (a[i].name == s) {
				r = i;
				break;
			}
		if (r == -1) {
			r = ++tot;
			a[r].fa = r;
			a[r].name = s;
		}
		if (c == '#') {
			fa = a[r].fa;
			continue;
		}
		if (c == '+') {
			merge(fa, r);
			continue;
		}
		if (c == '?')
			cout << s << " " << a[find(r)].name << endl;
	} while (1);
	return 0;
}
2022/12/22 19:27
加载中...