比赛链接:

https://codeforces.com/contest/1688/problem/C

C. Manipulating History

题意:

给定 2 * n 个字符串,将它们重新排序,每次可以选择一个等于 \(s_{2i}\) 的子串,将它变成 \(s_{2i + 1}\),现在已知最后的字符串,求出最开始的字符(最开始只有一个字符)。

思路:

当某个字母从当前字符串删除时,会在字符串集合中出现一次。
当某个字母加入当前字符串时,也会在字符串集合中出现一次。
即除了最开始的字母,所有后面加入的字母都出现了偶数次。

代码:

#include <bits/stdc++.h>
using namespace std;
#define LL long long
LL T, n;
void solve(){
	cin >> n;
	vector <int> cnt(30);
	for (int i = 1; i <= 2 * n + 1; i ++ ){
		string s;
		cin >> s;
		for (auto x : s)
			cnt[x - 'a'] ++ ;
	}
	for (char x = 'a'; x <= 'z'; x ++ )
		if (cnt[x - 'a'] & 1)
			cout << x << "\n";
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);
	cin >> T;
	while (T -- )
		solve();
	return 0;
}
posted on 2022-06-05 22:34  Hamine  阅读(44)  评论(0编辑  收藏  举报