Educational Codeforces Round 110 (Rated for Div. 2) C. Unstable String (dp)

Posted Accelerator

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational Codeforces Round 110 (Rated for Div. 2) C. Unstable String (dp)相关的知识,希望对你有一定的参考价值。

  • 题意:有一\\(01\\)串,\\(?\\)既可以表示成\\(0\\)也可以表示成\\(1\\),问其所有子串中,问有多少不出现相邻相同字符的子串。

  • 题解:根据题意,合法串一定0101这样的,那么当前位置的1/0肯定是从上个位置的0/1转移过来,如果上个位置的字符和当前相同,那么就重新开始。由此可以写出状态转移方程:\\(dp[i][0/1]=dp[i-1][1/0]+1\\),再去考虑\\(?\\)的情况,这里我们可以直接从\\(dp[i-1][0]\\)\\(dp[i-1][1]\\)转移过来,但是会有多出来的情况,比如i-1是0,i是?,那么合法情况只有?取1才行,由于我们把0的情况也算上了,所以再减去重复的贡献(1+2+3+4...)即可。

  • 代码

    #include <bits/stdc++.h>
    #define ll long long
    #define fi first
    #define se second
    #define pb push_back
    #define me memset
    #define rep(a,b,c) for(int a=b;a<=c;++a)
    #define per(a,b,c) for(int a=b;a>=c;--a)
    const int N = 1e6 + 10;
    const int mod = 1e9 + 7;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    typedef pair<int,int> PII;
    typedef pair<ll,ll> PLL;
    ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
    ll lcm(ll a,ll b) {return a/gcd(a,b)*b;}
     
     
    ll dp[N][2];
     
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    	int _;
    	cin>>_;
    	while(_--){
    		string s;
    		cin>>s;
    		int n=(int)s.size();
    		s=" "+s;
    		rep(i,0,n) dp[i][0]=dp[i][1]=0;
     
    		ll ans=0;
    		
    		for(int i=1;i<=n;++i){
    			if(s[i]==\'0\') dp[i][0]=dp[i-1][1]+1;
    			if(s[i]==\'1\') dp[i][1]=dp[i-1][0]+1;
    			if(s[i]==\'?\'){
    				dp[i][0]=dp[i-1][1]+1;
    				dp[i][1]=dp[i-1][0]+1;
    			}
    			ans+=dp[i][0];
    			ans+=dp[i][1];
    		}
     
     
    		ll cnt=0;
    		for(int i=1;i<=n;++i){
    			if(s[i]==\'?\') cnt++;
    			else{
    				ans-=(cnt)*(cnt+1)/2;
    				cnt=0;
    			}
    		}
    		ans-=cnt*(cnt+1)/2;
     
    		cout<<ans<<\'\\n\';
     
     
    	}
    	
        return 0;
    }
    

以上是关于Educational Codeforces Round 110 (Rated for Div. 2) C. Unstable String (dp)的主要内容,如果未能解决你的问题,请参考以下文章

Educational Codeforces Round 7 A

Educational Codeforces Round 7

Educational Codeforces Round 90

Educational Codeforces Round 33

Codeforces Educational Codeforces Round 54 题解

Educational Codeforces Round 27