zoukankan      html  css  js  c++  java
  • ZOJ4060 Flipping Sequence(思维)

    题意:

    给出两串01序列,一次操作可以使得一个区间l,r内的所有字符反转,要求两次操作后第一串序列变成第二串序列,询问有多少种方案?

    题解:

    先做一个异或运算,相同的为0,不同的为1,存到一个新的数组里

    如果长度为1位且相同,那么直接输出1

    如果每一位都不相同,那么方案数为(N-1)*2

    如果每一位都相同,那么方案数为N*(N+1)/2

    如果不相同的连续段数大于两段,直接输出0

    如果只有一段不相同,方案数为(N-1)*2

    如果有两段不相同,方案数为6

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e7+10;
    typedef long long ll;
    char s1[maxn],s2[maxn];
    int a[maxn];
    int T;
    int main () {
        scanf("%d",&T);
        while (T--) {
            ll ans=0;
            int N;
            scanf("%d",&N);
            scanf("%s%s",s1,s2);
            for (int i=0;i<N;i++) {
                a[i]=(s1[i]-'0')^(s2[i]-'0');
                ans+=a[i];
            }
            if (N==1&&a[0]==0) {
                printf("1
    ");
                continue;
            }
            if (ans==N) {
                printf("%lld
    ",(ll)(N-1)*2);
                continue;
            }
            if (ans==0) {
                printf("%lld
    ",(ll)N*(N+1)/2);
                continue;
            }
            ans=0;
            if (a[0]==1) ans++;
            for (int i=1;i<N;i++) {
                if (a[i]==1&&a[i-1]!=1) ans++;
                if (ans>2) break;
            }
            if (ans>2) {
                printf("0
    ");
                continue;
            }
            if (ans==1) {
                printf("%lld
    ",(ll)(N-1)*2);
            }
            if (ans==2) {
                printf("6
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    摆花
    关于我的博客
    博客美化更新日志
    页面美化代码1.x
    本人已转至新博客!
    回归博客园
    退役快乐
    Luogu神贴合辑
    代码高亮预览
    NOIp2018普及组初赛解题报告
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/12505917.html
Copyright © 2011-2022 走看看