湘潭G.String Transformation(思维)
发布日期:2021-06-30 10:32:58 浏览次数:2 分类:技术文章

本文共 1173 字,大约阅读时间需要 3 分钟。

因为 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 
using namespace std;const int maxn = 1e6+10;char a[maxn],b[maxn];vector
get(char a[]){
int n = strlen( a+1 ), sum = 0; vector
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;}

转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/116541163 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:2019牛客国庆集训派对day2 J.Vertex Cover(思维,组合数学算贡献)
下一篇:2019牛客国庆集训派对day2 C.Just h-index(主席树)

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月26日 09时57分00秒