CF1688 C. Manipulating History [纯思维]

传送门: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+xkg+y+zh>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;
}
  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值