CF1774C题解

题目传送门

假设最后一场的环境为 11,即温度大的人赢,那么温度为 11 的人即使活到了最后一场也必输。

同理,如果最后 kk 场的环境都为 11,那么有 k(1k)k(1\sim k) 个人一定没机会赢,另外的 xkx-k 名选手都有机会赢,因为只有温度大于等于 k+1k+1 的人才可能连续战胜温度为 1k1\sim k 的人活到最后。

那么如何保证 k+1xk+1\sim x 名选手都有机会活到最后 kk 场呢?假设要使选手 i(k+1ix)i(k+1\le i\le x) 活到最后 kk 场,只需要先让剩下的在 k+1xk+1\sim x 中的选手互相对战,由于第 k1k-1 场环境一定为 00,那么让剩下的另一名选手 jj1k1\sim k 中的选手打,被淘汰,那么 ii 就活到了最后 kk 场。

反之如果最后 kk 场的环境都为 00 也同样可以证明有机会赢的人数为 xkx-k

AC Code:

#include<bits/stdc++.h>
using namespace std;
int t,n;
string s;
int main(){
    cin>>t;
    while(t--){
        cin>>n>>s;
        cout<<1<<' ';
        for(int i=1,k=1;i<s.size();i++){//k表示最长相同后缀的长度
            if(s[i]==s[i-1]){
            	k++;	
			}
            else{
            	k=1;	
			}
            cout<<i+2-k<<' ';//第1~i+2名选手参赛
        }
        cout<<endl;
    }
    return 0;
}
posted @   KK_SpongeBob  阅读(6)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
点击右上角即可分享
微信分享提示