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\n");
            continue;
        }
        if (ans==N) {
            printf("%lld\n",(ll)(N-1)*2);
            continue;
        }
        if (ans==0) {
            printf("%lld\n",(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\n");
            continue;
        }
        if (ans==1) {
            printf("%lld\n",(ll)(N-1)*2);
        }
        if (ans==2) {
            printf("6\n");
        }
    }
    return 0;
}

 

posted @ 2020-03-16 19:11  zlc0405  阅读(108)  评论(0编辑  收藏  举报