首页 > 其他分享 >Codeforces 1730 D

Codeforces 1730 D

时间:2022-11-01 21:55:51浏览次数:52  
标签:cnt int 1730 texttt Codeforces cin

Codeforces 1730 D

题意

定义一次“操作”为

把字符串 $ a $ 的前 $ k $ 个字母与字符串 $ b $ 的后 $ k $ 个字母交换。

问能不能经过有限次操作后,让 $ a = b $ 。
注:$ |a| = |b| = n $ 。

思路

先放结论:

将 $ a_1 $ 与 $ b_n $ 配对,$ a_2 $ 与 $ b_{n - 1} $ 配对 …… $ a_n $ 与 $ b_1 $ 配对成 无序组
如果这些对子能组成回文(例如:$ (a, c), (a, b), (c, c), (a, b), (c, a) $ 就是回文),那么可以。
在 $ n \bmod 2 = 1 $ 的时候,我们还需要保证对于中间那一对 $ a_i = b_i $ 。

设 $ a = \texttt{abxxxx}, b = \texttt{xxxxcb} $ 。
魔性的操作来了!
把 $ \ b \ $ 反 转 !

\[a = \texttt{abxxxx}, b = \texttt{bcxxxx} \]

分组变成了 $ (a_1, b_1), (a_2, b_2), \cdots, (a_n, b_n) $ 。
(接下来讲的 $ b $ 都是反转后的 $ b $)
我们需要证明:

  1. 每组两个元素相对位置相等(即,对应 $ a_i $ 的永远是 $ b_i $)。

    可我证不出来(别打死我)

  2. 每组两个元素可以随便交换

    $ k = i, 1, i $
    举个例子,交换 $ a_2, b_2 $ 。

    $ k = 2 $ ,$ a = \texttt{cbxxxx}, b = \texttt{baxxxx} $ 。
    $ k = 1 $ ,$ a = \texttt{bbxxxx}, b = \texttt{caxxxx} $ 。
    $ k = 2 $ ,$ a = \texttt{acxxxx}, b = \texttt{bbxxxx} $ 。

  3. 组可以换到别处去(把 $ (a_i, b_i) $ 换到 $ (a_j, b_j) \()(\) i < j $)

    $ k = i, j \( 举个例子,\) (a_3, b_3) \to (a_2, b_2) $。

    $ k = 2 $ ,$ a = \texttt{cbxxxx}, b = \texttt{baxxxx} $ 。
    $ k = 3 $ ,$ a = \texttt{xabxxx}, b = \texttt{xabxxx} $ 。

有了这三点,就好证明了。

代码

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

struct pp {
	char a, b;
} s[100005];

int cnt[150][150];

int main() {
	int t;
	cin >> t;
	while (t--) {
		memset(cnt, 0, sizeof cnt);
		int n;
		cin >> n;
		string s1, s2;
		cin >> s1 >> s2;
//		cerr << s1 << " " << s2 << endl;
		for (int i = 0; i < n; i++) {
			s[i].a = min(s1[i], s2[n - i - 1]);
			s[i].b = max(s1[i], s2[n - i - 1]);
//			cerr << s[i].a << " " << s[i].b << endl;
		}
		for (int i = 0; i < n; i++) {
			cnt[s[i].a][s[i].b]++;
		}
		bool flag = 1;
		bool odded = !(n & 1);
		for (char ch = 'a'; ch <= 'z'; ch++) {
			if (cnt[ch][ch] & 1) {
				if (odded) {
					flag = 0;
				} else {
					odded = 1;
				}
			}
		}
		for (char i = 'a'; i <= 'z'; i++) {
			for (char j = i + 1; j <= 'z'; j++) {
				if (i != j) {
					flag &= (cnt[i][j] % 2 == 0);
				}
			}
		}
		if (flag) {
			puts("YES");
		} else {
			puts("NO");
		}
	}
	return 0;
}

标签:cnt,int,1730,texttt,Codeforces,cin
From: https://www.cnblogs.com/AProblemSolver/p/16849308.html

相关文章

  • Educational Codeforces Round 81 (Rated for Div. 2) D
    D.SameGCDs对于题目所给的公式gcd(a,m)=gcd(a+x,m)由辗转相除我们把第二个式子变一下gcd((a+x)%m,m)x的取值范围为[0,m)(a+x)%m也是所以我们可以直接写成gcd(a,m)=g......
  • Codeforces 1670 E. Hemose on the Tree
    题意给你个数p,n=2^p;有一棵树有n个节点,告诉你怎么连边;每个点有个权值,每条边也有个权值,权值需要自行分配,[1,2,3..n...2n-1],总共2n-1个权值;你需要选一个节点,使得他到所......
  • Codeforces Round #113 (Div. 2) E. Tetrahedron(dp/递推)
    https://codeforces.com/problemset/problem/166/E题目大意:给定一个正三角锥,最上面的顶点是D点,下面三个点分别标号为ABC给定n次,我们初始化在D点上,并且要求最后第n步也......
  • Codeforces Round #650 (Div. 3) D
    D.TaskOnTheBoard观察样例我们发现一定会有0的存在然后呢?我们发现给出的题意中只是小的字符一定会加上与比它大的字符的距离数据范围是50我们知道了最大的字符......
  • Codeforces Round #667 (Div. 3) E
    E.TwoPlatforms读完题发现好像跟y坐标没关系考虑dpdp[i][0/1/2]表示以第i个点结尾的用了0/1/2个板子的max显然我们对于0我们都是初始化为0对于dp[i][1]我们直接dp[......
  • Codeforces Round #617 (Div. 3) E1
    E1.StringColoring(easyversion)观察样例我们发现要是最长下降子序列要是>=3那我们显然不可能有解然后我们考虑构造要是最长最长下降子序列只是2的话那显然我们只......
  • Codeforces - 839C - Journey(图论 + 概率 + 搜索、*1500)
    839C-Journey(⇔源地址)目录839C-Journey(⇔源地址)tag题意思路错误思路正解AC代码错误次数:2tag⇔图论、⇔概率、⇔搜索、⇔*1500题意在七......
  • Codeforces Round #658 (Div. 1) B
    B.Unmerge看完样例发现31243后面跟着的12肯定是和3一组的因为他们不如3大所以他们一定是被直接排出来的就这样我们可以将这个序列分成好多组然后就是金典背包......
  • Codeforces Round #683 (Div. 1, by Meet IT) B
    B.CatchingCheaters对于我们做过的模板提来说这道题是子串那显然我们要改变一下我们的状态表示dp[i][j]表示以ai,bj结尾的max我们状态转移就是dp[i][j]=max{dp[i-1]......
  • Educational Codeforces Round 110 (Rated for Div. 2) D
    D.PlayoffTournament观察完题发现没改变一个只会修改自己及以上的权值所以我们直接暴力qlogn但是这个题恶心的就是他那个是倒着给的我们要reverse一遍注意这时候......