传送门:CF
[前题提要]:纯思维,很好的恶心了我,但是了解trick后感觉还是有点典的,故记录一下
感觉这道题如果没有了解过类似的trick,将会很难下手.
发现有一个很重要的性质就是刚开始只有一个字符,那么如果将最终字符串也看成一个操作,也就是将最后一个字符串变成一个空串,那么就是所有的字符个数经过增加/减少变成了0.将其数学化一下:假设一个字符的初始个数为
a
a
a.
其经过的过程一定类似于下面:
h
−
>
x
(
选择了
h
个该字符
,
修改为了
x
个
,
下同
)
h->x(选择了h个该字符,修改为了x个,下同)
h−>x(选择了h个该字符,修改为了x个,下同)
k
−
>
y
k->y
k−>y
g
−
>
z
g->z
g−>z
a
+
x
−
k
−
g
+
y
+
z
−
h
−
>
0
a+x-k-g+y+z-h->0
a+x−k−g+y+z−h−>0
我们将左右两边所有数字加起来,会发现是
a
+
2
x
+
2
y
+
2
z
a+2x+2y+2z
a+2x+2y+2z.
此时就不难发现规律了,假设初始字符是一个,那么最后所有操作左右两边的字符个数加起来就是奇数;假设初始字符为0,那么就是偶数.
那么怎么想到这个要这么做呢,感觉还是得从初始字符只有一个入手,但是怎么从那个关键点想到这个呢,感觉就和做题经验有关了…
下面是具体的代码部分:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define root 1,n,1
#define ls (rt<<1)
#define rs (rt<<1|1)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {
ll x=0,w=1;char ch=getchar();
for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x*w;
}
inline void print(__int128 x){
if(x<0) {putchar('-');x=-x;}
if(x>9) print(x/10);
putchar(x%10+'0');
}
#define maxn 1000000
const double eps=1e-8;
#define int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
string t[maxn];
int main() {
int T=read();
while(T--) {
int n=read();
map<char,int>mp;
for(int i=1;i<=2*n;i++) {
cin>>t[i];
for(int j=0;j<t[i].length();j++) {
mp[t[i][j]]++;
}
}
string s;cin>>s;
for(int j=0;j<s.length();j++) mp[s[j]]++;
char ans;
for(char i='a';i<='z';i++) {
if(mp[i]&1) {
ans=i;break;
}
}
cout<<ans<<endl;
}
return 0;
}