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

封面

思路:

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

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

求出是奇数位的字母是重的,还是偶数位的字母重的,就好写了,只需要在判断的时候看现在历遍的字母的下标是不是需要重的,如果在不需要重的时候重了或在要重的地方没有重就输出 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";
}
}
}
}

此代码已提交测试过。