zoukankan      html  css  js  c++  java
  • ZOJ 4060

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4060

    题意:

    给出两个 $0,1$ 字符串 $S,T$,现在你有两次对 $S$ 作区间翻转($0 ightarrow 1,1  ightarrow 0$)的操作,

    用四元组 $(l_1,r_1,l_2,r_2)$ 表示,代表第一次翻转区间 $[l_1,r_1]$,第二次翻转区间 $[l_2,r_2]$。

    问你有多少个四元组可以使得 $S=T$。

    题解:

    把 $S$ 尽可能少地分割成若干个子串。若某一子串和相应区间的 $T$ 一样,记作 $B$;反之,则记作 $A$。

    因此若 $A$ 的数量大于两个,就不可能通过区间翻转两次使得 $S=T$,因此 $A$ 最多是两个。

    分类讨论:

    1. $A$ 有 $0$ 个,即整个$S$ 可表示为 $B$,任意翻转两次相同区间 $[i,j]$ 即可。整个 $1 sim |S|$ 可以有 $|S| + (|S|-1) + cdots + 1 = frac{|S|(|S|+1)}{2}$。
    2. $A$ 有 $1$ 个,即$S$ 可表示为 $(B)A(B)$。若两边都没有 $B$,则可以将 $A$ 分成两个部分 $[l,m],[m+1,r]$ 分别翻转,考虑 $m$ 取值的可能有 $2 imes (|A|-1)$ 种;若两侧都有 $B$,即 $BAB$,则应在前面那种基础上,再算上,在某一侧的 $B$ 中挑选一个左端点,再以 $A$ 的右端点为区间右端点,这样一来有 $2 imes |B|$ 种选择。两者加起来即 $2 imes (|A|-1+|B|) = 2 imes (|S|-1)$。
    3. $A$ 有 $2$ 个,即$S$ 可表示为 $(B)ABA(B)$。只能有三种翻法:①ABA,B;②AB,BA;③A,A。因此即 $2 imes 3 = 6$ 种可能性。

    AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    int n;
    string s,t;
    int main()
    {
        ios::sync_with_stdio(0);
        cin.tie(0);
        int T;
        cin>>T;
        while(T--)
        {
            cin>>n>>s>>t;
            int cnt=0;
            for(int i=0;i<n;i++) {
                if((i==0 || s[i-1]==t[i-1]) && s[i]!=t[i]) cnt++;
            }
            if(cnt>2) cout<<"0
    ";
            else if(cnt==2) cout<<"6
    ";
            else if(cnt==1) cout<<(2*n-2)<<'
    ';
            else cout<<((long long)n*(n+1)/2)<<'
    ';
        }
    }
  • 相关阅读:
    java内存模型
    类、对象和接口
    Python--数据存储:pickle模块的使用讲解
    Python--常用的内置函数
    Python--迭代器和生成器的定义和案例
    Python--作业2--对员工信息文件,实现增删改查操作
    Python--文本基本操作
    Python--字符串基本操作
    Python--字典基本操作
    Python--作业1--购物车程序
  • 原文地址:https://www.cnblogs.com/dilthey/p/9940927.html
Copyright © 2011-2022 走看看