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 @ 2023-11-11 21:20  KK_SpongeBob  阅读(15)  评论(0)    收藏  举报  来源