Codeforces-1688 C: Manipulating History 【构造】

Codeforces-1688 C: Manipulating History

题目传送门:Codeforces-1688 C

题目

题目截图

在这里插入图片描述

样例描述

在这里插入图片描述

题目大意

  字符串 s s s 的初始长度为 1 1 1,每一次可以将里面的子串 t 2 i − 1 t_{2i-1} t2i1 替换为 t 2 i t_{2i} t2i,如果出现多次 t 2 i − 1 t_{2i-1} t2i1,那么只有一个被替换为 t 2 i t_{2i} t2i。现在给出最终结果,和被打乱的 t t t 序列,问初始字符串是多少。

题目解析

  这道题最大的问题是读题。初始长度为 1 1 1,代表初始字符串其实就是一个字符;每一次替换字符串中的子串,说明 t 2 i − 1 t_{2i-1} t2i1 一定出现在当前字符串中,且在当前轮将被替换一次。题目保证初始字符串存在。
  那么,整个替换过程中,若我们假设变换过程中只有一个字符 c c c, 在之后其变换状态应该是从没有到有( c ∉ t 2 i − 1 , c ∈ t 2 i c \notin t_{2i-1},c \in t_{2i} c/t2i1,ct2i)、从有到有( c ∈ t 2 i − 1 , c ∈ t 2 i c \in t_{2i-1},c \in t_{2i} ct2i1,ct2i)、从有到没有( c ∈ t 2 i − 1 , c ∉ t 2 i c \in t_{2i-1},c \notin t_{2i} ct2i1,c/t2i),可以看到,每次交换的串中出现一次 c c c,字符串中 c c c 的出现情况就会变化。
  这种轮换可以推广到题目,我们把所有相关字符串通过填充空字符,变成等长的。可以发现,若初始字符是 c c c,结果字符串有奇数个 c c c,那么 2 t 2t 2t 个替换字符串里必然有偶数个 c c c, 依此类推,能够知道,所有输入中,出现奇数次数的字符就是结果,其余字符必然出现偶数次,那么我们直接用异或,把偶数次字符筛掉,就能得到最终答案。

Code

#include <bits/stdc++.h>
using namespace std;


int main() {
   int T, n; string s;
   cin >> T;
   while(T--) {
        cin >> n;
        n = 2 * n + 1;
        char ans = 0;
        while(n--) {
            cin >> s;
            for(auto k : s) ans ^= k;
        }
        cout << ans << endl;
   }
   return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值