续2.25测试复盘

描述cocktail 刚刚在他的Ubuntu里发现了两个字符串 s 和 t!他想做以下操作恰好两次使得 s 变成 t。操作是选择两个数字 l, r (1 ≤ l ≤ r ≤ n),将 si 变为 1-si 对于所有的 l ≤ i ≤ r。cocktail 想知道有多少种方法来做到。我们用如下规则来确定两种方式是否不同:令 A = (a1, a2, a3, a4),其中 1 ≤ a1 ≤ ...
摘要由CSDN通过智能技术生成

描述

cocktail 刚刚在他的Ubuntu里发现了两个字符串 s 和 t!他想做以下操作恰好两次使得 s 变成 t。
操作是选择两个数字 l, r (1 ≤ l ≤ r ≤ n),将 si 变为 1-si 对于所有的 l ≤ i ≤ r。
cocktail 想知道有多少种方法来做到。
我们用如下规则来确定两种方式是否不同:

令 A = (a1, a2, a3, a4),其中 1 ≤ a1 ≤ a2 ≤ n, 1 ≤ a3 ≤ a4 ≤ n,是 cocktail 的一种操作方案。
令 B = (b1, b2, b3, b4),其中 1 ≤ b1 ≤ b2 ≤ n, 1 ≤ b3 ≤ b4 ≤ n,是 cocktail 的令一种操作方案。
A 和 B 是不同的当且仅当存在 k 满足 ak ≠ bk。

输入

输入有多组测试用例。第一行包含数字 T 表示测试用例数目。
对于每个测试用例,第一行包含一个数字 n (1 ≤ n ≤ 106),表示两个二进制序列的长度。
第二行包含一个字符串 s1s2…sn (si ∈ {0,1}),表示第一个二进制串。
第三行包含一个字符串 t1t2…tn (ti ∈ {0,1}),表示第二个二进制串。
保证所有测试用例 n 的总和不超过 107。

输出

对于每组测试用例,输出一个数字表示答案。

样例

3
1
1
0
2
00
11
5
01010
00111

输出

0
2
6

题意

有两个二进制序列,你可以选择两个区间(只能在s上),要求反转所选的这段序列,要使得两序列变成一样,求有多少这样的选择方案(考虑先后顺序,调换两个区间的反转顺序方案加一)。

思路

那天晚上做这个题的时候完全没看懂,没思路,就是没找到方案数有什么规律。
通过两端序列的相同与不同可以把一段序列分成两种不同颜色的组合,与另一相同的假如是绿色,不相同的是红色,我们要做的就是把两端序列中红色部分全部消除,由于我们只能选择两个区间,所以当红色部分达到三个及以上时就没有办法将他们都消除,当红色部分为两个时,即S可表示为 (绿)红绿红(绿),只能有三种翻法:三个一起翻再把中间那个翻回来;翻前两个,再翻后两个;翻第一个再翻第三个;把顺序倒一下就是6种。当红色部分只有一个时:因为我们翻两次嘛,所以第一次翻完之后保证红色部分还有一个就行,①把红色部分分两次翻有len-1种选法(len是红色部分的长度)②翻红色部分全部加绿色部分,绿色部分的选择有len-1+n种。加起来乘二就是2n-2种。当没有红色部分时:翻过去再返回来就行了,有n(n+1)/2种这里两次翻的是同一个区间所以就不用乘二了。

AC代码

#include<iostream>
#include<cstdio>
using namespace std;
char s[1000010],t[1000010];
int main()
{
   
    int T;
    cin>>T;
    while(T--)
    {
   
       int n; 
       cin>>n;
       scanf("%s%s",s,t);
       int cnt=0;
       for(int i=0;i<n;i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值