2018 青岛ICPC区域赛 C Flippy Sequence
A Flippy Sequence
题意: 给出A和B两个01串,通过两次反转使得A串变成B串,问有多少种方法(这个反转指的是连续的一段区间)
分析: 分类讨论
- 两个串一样: 共有 n(n+1) 种
- 一个区间不一样:这个比较坑了,样例给的没有这种情况,坑了不少人,[a,b] 区间不一样,那么共有(b-a+a-1+n-b)*2种方法
- 两个区间不一样: 6种方法
- 三个及三个以上
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;
}