Codeforces Round #646 (Div. 2)--B. Subsequence Hate(1400分 思维+前缀和)

简介: 算法

16.png

题意:

如果一个字符串不包含 "010 "或 "101 "的子序列,则称为好字符串–例如,"1001 "包含 "101 "的子序列,因此它不是一个好字符串,而 "1000 "既不包含 "010 "也不包含 "101 "的子序列,所以它是一个好字符串。


那么,他最少要进行多少次操作才能使该字符串成为好字符串?可以证明,通过这些操作,我们可以使任何字符串变得良好。


思路:

010和101作为子串的情况都不能出现,那么母串出现0紧接着1的时候之后就不能出现0了,所以母串可能是00111or1110or1101,当然第三种情况会被视为101,所以也不能出现,所以答案串有几种情况:①:0000000,②000111,③111111,④111000,计算答案的时候可以把0开头和1开头分两种情况~计算答案的时候还有小细节我的处理是:

利用前缀和对于前面两种情况枚举边界的位置,答案数就是之后的0+之前的1和之前的1+之后的0取min~

#include<bits/stdc++.h>
using namespace std;
char s1[1005];
int sum0[1005],sum1[1005];
int main()
{
    int n,i,j,t;
    cin>>t;
    while(t--)
    {
        cin>>(s1+1);s1[0]='x';
        sum0[0]=0,sum1[0]=0;
        for(i=1;i<strlen(s1);i++) //0开头的情况
        {
            if(s1[i]=='0')
                sum0[i]=sum0[i-1]+1,sum1[i]=sum1[i-1];
            else
                sum1[i]=sum1[i-1]+1,sum0[i]=sum0[i-1];
        }
        int d1=strlen(s1)-1;
        int ans=0x3f3f3f3f;
        for(i=1;i<strlen(s1);i++)
        {
            ans=min({ans,((sum0[d1]-sum0[i])+(sum1[i-1])),(sum0[i-1]+sum1[d1]-sum1[i])});
        }
        ans=min({ans,d1-sum0[i-1],d1-sum1[i-1]});
        cout<<ans<<endl;
    }
    return 0;
}
相关文章
|
7月前
|
机器学习/深度学习 人工智能 BI
The Great Hero(Codeforces Round #700 (Div. 2))模拟+贪心思想和排序
The Great Hero(Codeforces Round #700 (Div. 2))模拟+贪心思想和排序
67 0
Codeforces Round 859 (Div. 4)题解
Codeforces Round 859 (Div. 4)题解
109 0
|
人工智能 BI
Codeforces Round #805 (Div. 3) 题解
Codeforces Round #805 (Div. 3) 题解
Codeforces Round #805 (Div. 3) 题解
|
机器学习/深度学习 人工智能 BI
Codeforces Round #751 (Div. 2) D. Frog Traveler(bfs 优化)
Codeforces Round #751 (Div. 2) D. Frog Traveler(bfs 优化)
142 0
|
机器学习/深度学习 Java
Codeforces Round #748 (Div. 3) D2. Half of Same(数学 枚举 思维)
Codeforces Round #748 (Div. 3) D2. Half of Same(数学 枚举 思维)
107 0
|
人工智能 索引
Codeforces Round #806 (Div. 4) 题解
Codeforces Round #806 (Div. 4) 题解

热门文章

最新文章