比赛 寒假集训5 评测结果 AAWWEAETET
题目名称 省选之后 最终得分 30
用户昵称 ychyyx 运行时间 2.715 s
代码语言 C++ 内存使用 38.26 MiB
提交时间 2026-03-01 10:58:33
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;
ll n,m;
string s,t;
ll k;
ll F,M;
int fa[100005],ma[100005];
bool b[100005];
ll ans=0;
int search(int i,char color){
    int k=0;
    for(int j=i+1;j<2*n;j++){
        if(s[j]==color){
            k=j;
            break;
        }
    }
    return k;
}
int main(){
    freopen("Toilets.in","r",stdin);
    freopen("Toilets.out","w",stdout);
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=m;i++){
        cin>>t;
        scanf("%lld",&k);
        while(k--)
            s+=t;
    }
    for(int i=0;i<2*n;i++){
        if(s[i]=='F')
            fa[++F]=i;
        else
            ma[++M]=i;
    }
    if(M>F){
        printf("-1");
        return 0;
    }else if(M==F){
        ll q=n-M;
        for(int i=0;i<2*n;i++){
            if(!b[i]){
                b[i]=1;
                if(s[i]=='F'){
                    if(s[i+1]=='F'){
                        k=search(i,'M');
                        if(k==0){
                            printf("-1");
                            return 0;
                        }
                        swap(s[i+1],s[k]);
                        ans=max(ans,k-i-1);
                    }
                }else{
                    if(s[i+1]=='M'){
                        k=search(i,'F');
                        if(k==0){
                            printf("-1");
                            return 0; 
                        }
                        swap(s[i+1],s[k]);
                        ans=max(ans,k-i-1);
                    }
                }
                b[i+1]=1;
            }
        }
    }else{
        ll q=n-M;
        for(int i=0;i<2*n;i++){
            if(!b[i]){
                b[i]=1;
                if(s[i]=='F'){
                    if(s[i+1]=='F'){
                        if(q>0){
                            q--;
                        }else{
                            k=search(i,'M');
                            if(k==0){
                                printf("-1");
                                return 0;
                            }
                            swap(s[i+1],s[k]);
                            ans=max(ans,k-i-1);
                        }
                    }
                }else{
                    if(s[i+1]=='M'){
                        k=search(i,'F');
                        if(k==0){
                            printf("-1");
                            return 0;
                        }
                        swap(s[i+1],s[k]);
                        ans=max(ans,k-i-1);
                    }
                }
                b[i+1]=1;
            }
        }
    }
    printf("%lld",ans);
    return 0;
}