题解 | #平衡的字符串#

平衡的字符串

https://ac.nowcoder.com/acm/contest/16832/D

D题题解

思路

k为奇数时显然无解,所以k只能为偶数 
k为偶数时,若满足题意则有:
对于 s[1]~s[k] num[0]=num[1]=k/2;
对于 s[2]~s[k+1] num[0]=num[1]=k/2
所以 s[1]=s[k+1]
 => s[i] 应该等于 s[i+k] , i+k<=n  (字符串下标从1开始)

所以我们让i%k,余数相同的为一组,共由k组(余数:1~k-1或0).显然同一组内不可以同时出现字符0和字符1
若出现了这种情况则无解.

继续对一组内不同时出现字符0和字符1的情况 进行分析:
若一组内,有一个字符为0则该组的字符全部变为0,若1则全变1
把能确定的字符 全部确定后,我们检查一下s[1]~s[k] 是否满足题意、
注意:此时的s[1]~s[k] 仍然可能存在字符'?'
情况1:不存在字符'?'  => num[0]=num[1]=k/2 时有解
情况2:存在字符'?'  => num[0]<=k/2&&num[1]<=k/2 时有解
综合两种情况,即满足 num[0]<=k/2&&num[1]<=k/2 时有解

综上,Code如下

Code

#include  <iostream>
#include  <algorithm>
#include  <cstring>

using namespace std;

const int N=1000010;

int n,k;
int x0,x1,x2;
bool st[N][2];
char s[N];

int main(){
    cin>>n>>k>>s+1;
    if(k&1) cout<<"No"<<endl;
    else{

        int flag=0;
        for(int i=1;i<=n;i++){
           int t=i%k;
           if(s[i]=='0') st[t][0]=true;
           else if(s[i]=='1') st[t][1]=true;
           if(st[t][0]==true&&st[t][1]==true) flag=1;
        }
        if(flag) cout<<"No"<<endl;  
        else{

            for(int i=1;i<=n;i++){
                int t=i%k;
                if(st[t][0]==true) s[i]='0';
                if(st[t][1]==true) s[i]='1';
            }

            for(int i=1;i<=k;i++){
                if(s[i]=='0') x0++;
                else if(s[i]=='1') x1++;
                else x2++;
            }
            if(x0<=k/2&&x1<=k/2) cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
        }

    }

    return 0;
}
全部评论

相关推荐

11-28 17:48
中山大学 C++
点赞 评论 收藏
分享
一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
美团 后端开发 总包n(15%是股票)
点赞 评论 收藏
分享
评论
3
收藏
分享
牛客网
牛客企业服务