洛谷题解字符串题解:P10296 [CCC 2024 S2] Heavy-Light Composition
xyx404
 思路:
先看题判断其中重的字母和轻的字母是否满足交替出现,由此我们可以得出要先求出是奇数位的字母是重的,还是偶数位的字母重的。
注意,称一个字母是重的当且仅当它在字符串中出现了超过一次,是在字符串里出现了几次,而不是在它这次出现前出现了几次。
求出是奇数位的字母是重的,还是偶数位的字母重的,就好写了,只需要在判断的时候看现在历遍的字母的下标是不是需要重的,如果在不需要重的时候重了或在要重的地方没有重就输出 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";
 }
 }
 }
 }
 
 | 
此代码已提交测试过。