2018 青岛ICPC区域赛 C Flippy Sequence

A Flippy Sequence
题意: 给出A和B两个01串,通过两次反转使得A串变成B串,问有多少种方法(这个反转指的是连续的一段区间)
分析: 分类讨论

  1. 两个串一样: 共有 n(n+1) 种
  2. 一个区间不一样:这个比较坑了,样例给的没有这种情况,坑了不少人,[a,b] 区间不一样,那么共有(b-a+a-1+n-b)*2种方法
  3. 两个区间不一样: 6种方法
  4. 三个及三个以上
const int  maxn = 1e6+10;
char ar[maxn],br[maxn];
int main(void)
{
    int T;
    cin>>T;
    while(T--){
        int n;
        scanf("%d",&n);
        scanf("%s",ar+1);
        scanf("%s",br+1);
        int cnt,l,r;
        cnt = l = r = 0;
        bool sign = 0;
        for(int i = 1;i <= n; ++i){
            if(ar[i] == br[i] && !sign) continue;
            if(ar[i] != br[i] &&  sign) continue;
            if(ar[i] == br[i] &&  sign) {
                r = i-1;
                sign = false;
                continue;
            }
            if(ar[i] != br[i] && !sign) {
                cnt++;
                l = i;
                sign = true;
                continue;
            }
        }
        if(cnt >= 3){
            printf("0\n");
        }
        else if(cnt == 2){
            printf("6\n");
        }
        else if(cnt == 1){
            int ans = 0;
            ans += (r-l);
            ans +=  l-1+n-r;
            printf("%d\n",ans*2);
        }
        else if(cnt == 0){
            printf("%lld\n",1ll*n*(n+1)/2 );
        }
    }    

   return 0;
}
全部评论

相关推荐

10-28 14:42
门头沟学院 Java
watermelon1124:因为嵌入式炸了
点赞 评论 收藏
分享
与火:这不接? 留子的钱不挣白不挣
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务