湘潭G.String Transformation(思维)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了湘潭G.String Transformation(思维)相关的知识,希望对你有一定的参考价值。
因为 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(思维)的主要内容,如果未能解决你的问题,请参考以下文章