湘潭G.String Transformation(思维)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了湘潭G.String Transformation(思维)相关的知识,希望对你有一定的参考价值。

LINK

因为 a b − > a a b a b b − > b a ab->aababb->ba ab>aababb>ba

b a − > a a b a b b − > a b ba->aababb->ab ba>aababb>ab

说明 a b ab ab b a ba ba之间可以相互转化

考虑所有变化不包括字符 c c c,所以原串分为若干段,我们比较每一段是否能进行转换

我们先把所有的 a a , b b aa,bb aa,bb消除,最后会得到一串形如

a b a b a b . . . . ababab.... ababab....的串,或者是 b a b a b a . . . . . bababa..... bababa.....

如果串长度奇偶性质不同显然无法转化,因为所有操作都是改变偶数个字母

又因为我们可以把 b a − > a b ba->ab ba>ab

而且有操作消除 a b a b abab abab或者插入 b a b a baba baba,也就是消除偶数个 a a a b b b

那么假设串长为偶数

这么操作最后会得到 a b ab ab,或者 b a ba ba,或者空串

显然 a b , b a ab,ba ab,ba可以相互转化,却不能凭空变成空串

假设长为奇数

这么操作会得到 a a a,或者 b b b,或者 a b a aba aba,或者 b a b bab bab

a b a aba aba可以转化为 b b b,而 b a b bab bab可以转化为 a a a

显然判断一下是否相同即可

所以我们得到结论,如果两个串的 a , b a,b a,b奇偶性质有一个不同就不能转化,否则可以

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
char a[maxn],b[maxn];
vector<int>get(char a[])
{
	int n = strlen( a+1 ), sum = 0;
	vector<int>ans; ans.clear();
	for(int i=1;i<=n+1;i++)
	{
		if( a[i]=='c' || i==n+1 )	ans.push_back( sum ), sum = 0;
		else	sum ^= a[i];
	}
	return ans;
}
int main()
{
	while( cin >> ( a+1 ) >> (b+1) )
	{
		if( get(a)==get(b) )	cout << "Yes\\n";
		else	cout << "No\\n";
	}
	return 0;
} 

以上是关于湘潭G.String Transformation(思维)的主要内容,如果未能解决你的问题,请参考以下文章

[题解]2018湘潭邀请赛

湘潭比赛有感---铩羽之行

湘潭邀请赛——Alice and Bob

湘潭大学博士研究生入学考试有机合成科目波谱解析部分解答

2019年湘潭大学程序设计竞赛(重现赛)

2017-5-14 湘潭市赛 Strange Optimization