跳过正文
题解:P10296 [CCC 2024 S2] Heavy-Light Composition

题解:P10296 [CCC 2024 S2] Heavy-Light Composition

xyx404
作者
xyx404
Have a nice day.

封面

思路:
#

先看题判断其中重的字母和轻的字母是否满足交替出现,由此我们可以得出要先求出是奇数位的字母是重的,还是偶数位的字母重的。

注意,称一个字母是重的当且仅当它在字符串中出现了超过一次,是在字符串里出现了几次,而不是在它这次出现前出现了几次。

求出是奇数位的字母是重的,还是偶数位的字母重的,就好写了,只需要在判断的时候看现在历遍的字母的下标是不是需要重的,如果在不需要重的时候重了或在要重的地方没有重就输出 F 就可以了。

最后还有一个点,特判当字符串长度为二的时候,直接输出 F 就可以了。

整体思路就这么简单,但是坑多。

代码:
#

#include<bits/stdc++.h>
using namespace std;
long long T,N;
string a;
long long cnt[27]={0};
int main(){
	cin>>T>>N;
	while(T--){
		cin>>a;
		int jo=9;
		memset(cnt,0,sizeof(cnt));
		for(int i=0;i<a.size();i++){
			cnt[a[i]-'a']++;
		}
		if(N==2){//特判
			cout<<"F\n";continue;
		}
		else{
			bool yes=1;
			for(int i=0;i<a.size();i++){
				if(cnt[a[i]-'a']>=2)jo=i%2,yes=0;
			}
			if(yes){
				cout<<"F\n";
				continue;
			}
			if(jo==1){
				bool y=1;
				for(int i=0;i<a.size();i++){
					if(i%2==1){
						if(cnt[a[i]-'a']<2){
							y=0;break;
						}
					}
					else{
						if(cnt[a[i]-'a']>=2){
							y=0;break;
						}
					}
				}
				if(!y)cout<<"F\n";
				else cout<<"T\n";
			}
			else if(jo==0){
				bool y=1;
				for(int i=0;i<a.size();i++){
					if(i%2==0){
						if(cnt[a[i]-'a']<2){
							y=0;break;
						}
					}
					else{
						if(cnt[a[i]-'a']>=2){
							y=0;break;
						}
					}
				}
				if(!y)cout<<"F\n";
				else cout<<"T\n";
			}
		}
	}
}

此代码已提交测试过。