Codeforces Round #796 (Div. 2), problem: (1688C) Manipulating History

一.题意 

tina具有改变字符串的能力,他能将主字符串的一部分字符变成另一种字符。

每次主字符串初始是一个字符,然后最终tina通过运用自己改变字符串内某段字符的能力,不断对这个本来只有一个字符的字符串进行变化,将这个字符变成了一个字符串。

有T组测试数据,每组测试数据给到你一个整数n,然后再给你2*n个字符串,这些字符串一部分是被改变的一段字符,一部分是将要改变的字符改变成的一段字符,没有固定顺序随机给出。

 

然后在2*n+1行给出了最终成为的字符串。

要求你猜出这个字符串最初是哪个字符。

二.思路

先说下结论,结论是在2*n+1所有字符串中出现次数为奇数的字符那就是最初的字符。

证明:我们来看一下每个被增添上来的字符的出现频率,不管是它单独作为替换字符去替换一段字符串,还是他作为替换字符段内的一个字符去替换现有的字符段,它一定是出现偶数次的,为什么呢?我们分两种情况:

①它被增添上来了,然后又被删掉了。这样的话它一次是作为改变成为的一段字符的一个字符,一次是作为被删字符段内的一个字符,此个字符一定会出现2次。

②它被增添上来了,没被删掉。这样的话它一次是作为改变成为的一段字符的一个字符,一次是作为最终结果的一个字符,因为他没被删掉嘛,所以也是偶数次。

但是最初那个字符一定会作为被改变的字符多出现1次。

所以最初那个字符一定出现奇数次,而其他字符一定出现偶数次。

其实如果把每个字符就算他长得一样也看做不一样的话,也就是最开始的那个字符会出现1次,其他都是2次.

三.代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
map<char,int> cnt;
void solve()
{
    int n;
    cin>>n;
    cnt.clear();
    for(int i=1;i<=2*n+1;i++)
    {
        string s;
        cin>>s;
        for(int i=0;i<s.size();i++)
        {
            cnt[s[i]]++;
        }
    }
    for(char i='a';i<='z';i++)
    {
        if(cnt[i]&1)
        {
            cout<<i<<endl;
            return;
        }
    }
    
    
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        solve();
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值