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; }