比赛 寒假集训5 评测结果 TATTTAEETE
题目名称 省选之后 最终得分 20
用户昵称 张雨晴 运行时间 5.991 s
代码语言 C++ 内存使用 7.38 MiB
提交时间 2026-03-01 11:32:10
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int M=500005;
#define int long long
int n,m;
int fnum,mnum;
int bh[M];
int fans=4611686018427387904;
int a[M];
int cnt;
int ans[M];
int b[M];
void dfs(int k){
    if(k>cnt){
//        for(int i=1;i<=cnt;i++){
//            cout<<ans[i]<<" "; 
//        }
//        cout<<"\n";
        for(int i=1;i<=cnt;i++){
//            cout<<i<<"\n";
            if(a[ans[i]]+a[ans[i+1]]==1){
                i++;
                continue;
            }else if(a[ans[i]]+a[ans[i+1]]==2){
                i++;
                continue;
            }
            int j=i;
            while(a[ans[j]]==0&&j<=cnt){
                j++;
            }
            j--;
            int num=j-i+1;
//            cout<<"num:"<<num<<"\n";
            if(j+num>cnt){
                return ;
            }
            int flag=1;
            for(int k=j+1;k<=j+num;k++){
                if(a[ans[k]]!=1){
                    flag=0;
                    break;
                }
            }
            if(flag==0){
//                cout<<"不合法\n";
                return ;
            }
            i=j+num;
        }
        int sum=0;
        for(int i=1;i<=cnt;i++){
            if(ans[i]>i){
//                cout<<i<<" "<<ans[i]-i<<"\n";
                sum=max(sum,ans[i]-i);
            }
        }
        fans=min(fans,sum);
        return ;
    }
    for(int i=1;i<=cnt;i++){
        if(b[i]) continue;
        if(a[i]==0&&mnum!=0){
            ans[k]=i;
            mnum--;
            b[i]=1;
            dfs(k+1);
            mnum++;
            b[i]=0;
        }else if(a[i]==1&&fnum!=0){
            ans[k]=i;
            fnum--;
            b[i]=1;
            dfs(k+1);
            fnum++;
            b[i]=0;
        }
    }
}
signed main(){
    freopen("Toilets.in","r",stdin);
    freopen("Toilets.out","w",stdout);
    
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        string s;
        int op;
        cin>>s>>op;
        for(int j=1;j<=op;j++){
            for(int k=0;k<s.size();k++){
                if(s[k]=='F'){
                    a[++cnt]=1;
                    bh[cnt]=cnt;
                    fnum++;
                }else{
                    a[++cnt]=0;
                    bh[cnt]=cnt;
                    mnum++;
                }
            }
        }
    }
//    cout<<fnum<<" "<<mnum<<"\n";
    if(mnum>fnum){
        cout<<-1;
        return 0;
    }
    dfs(1);
    cout<<fans;
    return 0;
}