Submission #1358198

#TimeUsernameProblemLanguageResultExecution timeMemory
1358198kanapojpmMiners (IOI07_miners)C++20
Compilation error
0 ms0 KiB
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include<iostream>
#include<vector>
using namespace std;
int dp[4][4][4][4][2];
int main(){
    cin.tie(NULL)->sync_with_stdio(false);
    int n;
    cin >> n;
    string s;
    cin >> s;
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
            for(int k=0;k<4;k++)
                for(int l=0;l<4;l++)
                    for(int m=0;m<2;m++)
                        dp[i][j][k][l][m]=-1e9;
    dp[0][0][0][0][0]=0;
    for(int i=1;i<=n;i++){
        int x = i%2;
        char c=s[i-1];
        if(c=='M'){
            for(int j=0;j<4;j++){
                for(int k=0;k<4;k++){
                    dp[0][1][j][k][x] = max(dp[0][1][j][k][x],dp[0][0][j][k][1-x]+1);

                    dp[1][1][j][k][x] = max(dp[1][1][j][k][x],dp[0][1][j][k][1-x]+1);
                    dp[1][1][j][k][x] = max(dp[1][1][j][k][x],dp[1][1][j][k][1-x]+1);
                    dp[1][1][j][k][x] = max(dp[1][1][j][k][x],dp[2][1][j][k][1-x]+2);
                    dp[1][1][j][k][x] = max(dp[1][1][j][k][x],dp[3][1][j][k][1-x]+2);

                    dp[2][1][j][k][x] = max(dp[2][1][j][k][x],dp[0][2][j][k][1-x]+2);
                    dp[2][1][j][k][x] = max(dp[2][1][j][k][x],dp[1][2][j][k][1-x]+2);
                    dp[2][1][j][k][x] = max(dp[2][1][j][k][x],dp[2][2][j][k][1-x]+2);
                    dp[2][1][j][k][x] = max(dp[2][1][j][k][x],dp[3][2][j][k][1-x]+3);

                    dp[3][1][j][k][x] = max(dp[3][1][j][k][x],dp[0][3][j][k][1-x]+2);
                    dp[3][1][j][k][x] = max(dp[3][1][j][k][x],dp[1][3][j][k][1-x]+2);
                    dp[3][1][j][k][x] = max(dp[3][1][j][k][x],dp[2][3][j][k][1-x]+3);
                    dp[3][1][j][k][x] = max(dp[3][1][j][k][x],dp[3][3][j][k][1-x]+2);

                    dp[j][k][0][1][x] = max(dp[j][k][0][1][x],dp[j][k][0][0][1-x]+1);

                    dp[j][k][1][1][x] = max(dp[j][k][1][1][x],dp[j][k][0][1][1-x]+1);
                    dp[j][k][1][1][x] = max(dp[j][k][1][1][x],dp[j][k][1][1][1-x]+1);
                    dp[j][k][1][1][x] = max(dp[j][k][1][1][x],dp[j][k][2][1][1-x]+2);
                    dp[j][k][1][1][x] = max(dp[j][k][1][1][x],dp[j][k][3][1][1-x]+2);

                    dp[j][k][2][1][x] = max(dp[j][k][2][1][x],dp[j][k][0][2][1-x]+2);
                    dp[j][k][2][1][x] = max(dp[j][k][2][1][x],dp[j][k][1][2][1-x]+2);
                    dp[j][k][2][1][x] = max(dp[j][k][2][1][x],dp[j][k][2][2][1-x]+2);
                    dp[j][k][2][1][x] = max(dp[j][k][2][1][x],dp[j][k][3][2][1-x]+3);

                    dp[j][k][3][1][x] = max(dp[j][k][3][1][x],dp[j][k][0][3][1-x]+2);
                    dp[j][k][3][1][x] = max(dp[j][k][3][1][x],dp[j][k][1][3][1-x]+2);
                    dp[j][k][3][1][x] = max(dp[j][k][3][1][x],dp[j][k][2][3][1-x]+3);
                    dp[j][k][3][1][x] = max(dp[j][k][3][1][x],dp[j][k][3][3][1-x]+2);
                }
            }
        }
        else if(c=='B'){
            for(int j=0;j<4;j++){
                for(int k=0;k<4;k++){
                    dp[0][2][j][k][x] = max(dp[0][2][j][k][x],dp[0][0][j][k][1-x]+1);

                    dp[1][2][j][k][x] = max(dp[1][2][j][k][x],dp[0][1][j][k][1-x]+2);
                    dp[1][2][j][k][x] = max(dp[1][2][j][k][x],dp[1][1][j][k][1-x]+2);
                    dp[1][2][j][k][x] = max(dp[1][2][j][k][x],dp[2][1][j][k][1-x]+2);
                    dp[1][2][j][k][x] = max(dp[1][2][j][k][x],dp[3][1][j][k][1-x]+3);

                    dp[2][2][j][k][x] = max(dp[2][2][j][k][x],dp[0][2][j][k][1-x]+1);
                    dp[2][2][j][k][x] = max(dp[2][2][j][k][x],dp[1][2][j][k][1-x]+2);
                    dp[2][2][j][k][x] = max(dp[2][2][j][k][x],dp[2][2][j][k][1-x]+1);
                    dp[2][2][j][k][x] = max(dp[2][2][j][k][x],dp[3][2][j][k][1-x]+2);

                    dp[3][2][j][k][x] = max(dp[3][2][j][k][x],dp[0][3][j][k][1-x]+2);
                    dp[3][2][j][k][x] = max(dp[3][2][j][k][x],dp[1][3][j][k][1-x]+3);
                    dp[3][2][j][k][x] = max(dp[3][2][j][k][x],dp[2][3][j][k][1-x]+2);
                    dp[3][2][j][k][x] = max(dp[3][2][j][k][x],dp[3][3][j][k][1-x]+2);

                    dp[j][k][0][2][x] = max(dp[j][k][0][2][x],dp[j][k][0][0][1-x]+1);

                    dp[j][k][1][2][x] = max(dp[j][k][1][2][x],dp[j][k][0][1][1-x]+2);
                    dp[j][k][1][2][x] = max(dp[j][k][1][2][x],dp[j][k][1][1][1-x]+2);
                    dp[j][k][1][2][x] = max(dp[j][k][1][2][x],dp[j][k][2][1][1-x]+2);
                    dp[j][k][1][2][x] = max(dp[j][k][1][2][x],dp[j][k][3][1][1-x]+3);

                    dp[j][k][2][2][x] = max(dp[j][k][2][2][x],dp[j][k][0][2][1-x]+1);
                    dp[j][k][2][2][x] = max(dp[j][k][2][2][x],dp[j][k][1][2][1-x]+2);
                    dp[j][k][2][2][x] = max(dp[j][k][2][2][x],dp[j][k][2][2][1-x]+1);
                    dp[j][k][2][2][x] = max(dp[j][k][2][2][x],dp[j][k][3][2][1-x]+2);

                    dp[j][k][3][2][x] = max(dp[j][k][3][2][x],dp[j][k][0][3][1-x]+2);
                    dp[j][k][3][2][x] = max(dp[j][k][3][2][x],dp[j][k][1][3][1-x]+3);
                    dp[j][k][3][2][x] = max(dp[j][k][3][2][x],dp[j][k][2][3][1-x]+2);
                    dp[j][k][3][2][x] = max(dp[j][k][3][2][x],dp[j][k][3][3][1-x]+2);
                }
            }
        }
        else if(c=='F'){
            for(int j=0;j<4;j++){
                for(int k=0;k<4;k++){
                    dp[0][3][j][k][x] = max(dp[0][3][j][k][x],dp[0][0][j][k][1-x]+1);

                    dp[1][3][j][k][x] = max(dp[1][3][j][k][x],dp[0][1][j][k][1-x]+2);
                    dp[1][3][j][k][x] = max(dp[1][3][j][k][x],dp[1][1][j][k][1-x]+2);
                    dp[1][3][j][k][x] = max(dp[1][3][j][k][x],dp[2][1][j][k][1-x]+3);
                    dp[1][3][j][k][x] = max(dp[1][3][j][k][x],dp[3][1][j][k][1-x]+2);

                    dp[2][3][j][k][x] = max(dp[2][3][j][k][x],dp[0][2][j][k][1-x]+2);
                    dp[2][3][j][k][x] = max(dp[2][3][j][k][x],dp[1][2][j][k][1-x]+3);
                    dp[2][3][j][k][x] = max(dp[2][3][j][k][x],dp[2][2][j][k][1-x]+2);
                    dp[2][3][j][k][x] = max(dp[2][3][j][k][x],dp[3][2][j][k][1-x]+2);

                    dp[3][3][j][k][x] = max(dp[3][3][j][k][x],dp[0][3][j][k][1-x]+1);
                    dp[3][3][j][k][x] = max(dp[3][3][j][k][x],dp[1][3][j][k][1-x]+2);
                    dp[3][3][j][k][x] = max(dp[3][3][j][k][x],dp[2][3][j][k][1-x]+2);
                    dp[3][3][j][k][x] = max(dp[3][3][j][k][x],dp[3][3][j][k][1-x]+1);

                    dp[j][k][0][3][x] = max(dp[j][k][0][3][x],dp[j][k][0][0][1-x]+1);

                    dp[j][k][1][3][x] = max(dp[j][k][1][3][x],dp[j][k][0][1][1-x]+2);
                    dp[j][k][1][3][x] = max(dp[j][k][1][3][x],dp[j][k][1][1][1-x]+2);
                    dp[j][k][1][3][x] = max(dp[j][k][1][3][x],dp[j][k][2][1][1-x]+3);
                    dp[j][k][1][3][x] = max(dp[j][k][1][3][x],dp[j][k][3][1][1-x]+2);

                    dp[j][k][2][3][x] = max(dp[j][k][2][3][x],dp[j][k][0][2][1-x]+2);
                    dp[j][k][2][3][x] = max(dp[j][k][2][3][x],dp[j][k][1][2][1-x]+3);
                    dp[j][k][2][3][x] = max(dp[j][k][2][3][x],dp[j][k][2][2][1-x]+2);
                    dp[j][k][2][3][x] = max(dp[j][k][2][3][x],dp[j][k][3][2][1-x]+2);

                    dp[j][k][3][3][x] = max(dp[j][k][3][3][x],dp[j][k][0][3][1-x]+1);
                    dp[j][k][3][3][x] = max(dp[j][k][3][3][x],dp[j][k][1][3][1-x]+2);
                    dp[j][k][3][3][x] = max(dp[j][k][3][3][x],dp[j][k][2][3][1-x]+2);
                    dp[j][k][3][3][x] = max(dp[j][k][3][3][x],dp[j][k][3][3][1-x]+1);
                }
            }
        }
    }
    int ans=0;
    int x = n%2;
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
            for(int k=0;k<4;k++)
                for(int l=0;l<4;l++)
                    ans = max(ans,dp[i][j][k][l][x]);
    cout << ans;
}

Compilation message (stderr)

In file included from /usr/include/c++/13/string:43,
                 from /usr/include/c++/13/bits/locale_classes.h:40,
                 from /usr/include/c++/13/bits/ios_base.h:41,
                 from /usr/include/c++/13/ios:44,
                 from /usr/include/c++/13/ostream:40,
                 from /usr/include/c++/13/iostream:41,
                 from miners.cpp:3:
/usr/include/c++/13/bits/allocator.h: In destructor 'constexpr std::__cxx11::basic_string<char>::_Alloc_hider::~_Alloc_hider()':
/usr/include/c++/13/bits/allocator.h:184:7: error: inlining failed in call to 'always_inline' 'constexpr std::allocator< <template-parameter-1-1> >::~allocator() noexcept [with _Tp = char]': target specific option mismatch
  184 |       ~allocator() _GLIBCXX_NOTHROW { }
      |       ^
In file included from /usr/include/c++/13/string:54:
/usr/include/c++/13/bits/basic_string.h:181:14: note: called from here
  181 |       struct _Alloc_hider : allocator_type // TODO check __is_final
      |              ^~~~~~~~~~~~