Submission #569571

# Submission time Handle Problem Language Result Execution time Memory
569571 2022-05-27T14:09:51 Z esomer Miners (IOI07_miners) C++17
52 / 100
294 ms 596 KB
#include<bits/stdc++.h>

using namespace std;

#define endl "\n"

const int MOD = 1e9 + 7;

mt19937 gen(time(0));

/*void solve(){
    int n; cin >> n;
    string s; cin >> s;
    string s1;
    s1 += s[0];
    string s2;
    for(int i = 1; i < n; i++){
        bool eq = 1;
        for(int j = i - 1; j >= i - 2 && j >= 0; j--){
            if(s[i] != s[j]) eq = 0;
        }
        if(eq) s2 += s[i];
        else s1 += s[i];
    }
    int ans = 0;
    for(int i = 0; i < s1.size(); i++){
        bool one = 0;
        bool two = 0;
        bool three = 0;
        for(int j = i; j >= 0 && j >= i - 2; j--){
            if(s1[j] == 'F'){
                if(!one){
                    ans++;
                    one = 1;
                }
            }else if(s1[j] == 'M'){
                if(!two){
                    ans++;
                    two = 1;
                }
            }else if(!three){
                ans++;
                three = 1;
            }
        }
    }
    for(int i = 0; i < s2.size(); i++){
        bool one = 0;
        bool two = 0;
        bool three = 0;
        for(int j = i; j >= 0 && j >= i - 2; j--){
            if(s2[j] == 'F'){
                if(!one){
                    ans++;
                    one = 1;
                }
            }else if(s2[j] == 'M'){
                if(!two){
                    ans++;
                    two = 1;
                }
            }else if(!three){
                ans++;
                three = 1;
            }
        }
    }
    cout << ans << endl;
}*/

int solve(int n, string& s){
    string s1;
    s1 += s[0];
    string s2;
    for(int i = 1; i < n; i++){
        int ans1 = 0;
        int ans2 = 0;
        if(s1.size() > 1){
            if(s1[s1.size() - 1] == s1[s1.size() - 2]){
                if(s[i] == s1[s1.size() - 1]) ans1 = 1;
                else ans1 = 2;
            }else{
                if(s1[s1.size() - 1] != s[i] && s1[s1.size() - 2] != s[i]) ans1 = 3;
                else ans1 = 2;
            }
        }else if(s1.size() > 0){
            if(s1[0] == s[i]) ans1 = 1;
            else ans1 = 2;
        }else ans1 = 1;
        if(s2.size() > 1){
            if(s2[s2.size() - 1] == s2[s2.size() - 2]){
                if(s[i] == s2[s2.size() - 1]) ans2 = 1;
                else ans2 = 2;
            }else{
                if(s2[s2.size() - 1] != s[i] && s2[s2.size() - 2] != s[i]) ans2 = 3;
                else ans2 = 2;
            }
        }else if(s2.size() > 0){
            if(s2[0] == s[i]) ans2 = 1;
            else ans2 = 2;
        }else ans2 = 1;
        if(ans1 > ans2) s1 += s[i];
        else s2 += s[i];
    }
    int ans = 0;
    for(int i = 0; i < s1.size(); i++){
        bool one = 0;
        bool two = 0;
        bool three = 0;
        for(int j = i; j >= 0 && j >= i - 2; j--){
            if(s1[j] == 'F'){
                if(!one){
                    ans++;
                    one = 1;
                }
            }else if(s1[j] == 'M'){
                if(!two){
                    ans++;
                    two = 1;
                }
            }else if(!three){
                ans++;
                three = 1;
            }
        }
    }
    for(int i = 0; i < s2.size(); i++){
        bool one = 0;
        bool two = 0;
        bool three = 0;
        for(int j = i; j >= 0 && j >= i - 2; j--){
            if(s2[j] == 'F'){
                if(!one){
                    ans++;
                    one = 1;
                }
            }else if(s2[j] == 'M'){
                if(!two){
                    ans++;
                    two = 1;
                }
            }else if(!three){
                ans++;
                three = 1;
            }
        }
    }
    return ans;
}

int solve2(int n, string& s){
    int best = 0;
    for(int i = 0; i < (1 << (s.size())); i++){
        string s1;
        string s2;
        for(int j = 0; j < s.size(); j++){
            if(i & (1 << j)) s1 += s[j];
            else s2 += s[j];
        }
        int ans = 0;
        for(int i = 0; i < s1.size(); i++){
            bool one = 0;
            bool two = 0;
            bool three = 0;
            for(int j = i; j >= 0 && j >= i - 2; j--){
                if(s1[j] == 'F'){
                    if(!one){
                        ans++;
                        one = 1;
                    }
                }else if(s1[j] == 'M'){
                    if(!two){
                        ans++;
                        two = 1;
                    }
                }else if(!three){
                    ans++;
                    three = 1;
                }
            }
        }
        for(int i = 0; i < s2.size(); i++){
            bool one = 0;
            bool two = 0;
            bool three = 0;
            for(int j = i; j >= 0 && j >= i - 2; j--){
                if(s2[j] == 'F'){
                    if(!one){
                        ans++;
                        one = 1;
                    }
                }else if(s2[j] == 'M'){
                    if(!two){
                        ans++;
                        two = 1;
                    }
                }else if(!three){
                    ans++;
                    three = 1;
                }
            }
        }
        best = max(best, ans);
    }
    return best;
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    //int tt; cin >> tt;
    //int tt = 1;
    //for(int i = 1; i <= tt; i++) solve();

    /*for(int h = 0; h < 10000; h++){
        int n = gen() % 10 + 1;
        string s;
        for(int i = 0; i < n; i++){
            int x = gen() % 3;
            if(x == 2) s+= 'F';
            else if(x == 1) s+= 'B';
            else s += 'M';
        }
        if(solve(n, s) != solve2(n, s)){
            cout << s << endl;
            cout << "Output: "<< solve(n, s) << " correct: "<< solve2(n, s) << endl;
            return 0;
        }
    }*/

    int n; cin >> n;
    string s; cin >> s;
    if(n <= 20) cout << solve2(n, s) << endl;
    else cout << solve(n, s) << endl;

    return 0;
}

Compilation message

miners.cpp: In function 'int solve(int, std::string&)':
miners.cpp:106:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  106 |     for(int i = 0; i < s1.size(); i++){
      |                    ~~^~~~~~~~~~~
miners.cpp:127:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  127 |     for(int i = 0; i < s2.size(); i++){
      |                    ~~^~~~~~~~~~~
miners.cpp: In function 'int solve2(int, std::string&)':
miners.cpp:156:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  156 |         for(int j = 0; j < s.size(); j++){
      |                        ~~^~~~~~~~~~
miners.cpp:161:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  161 |         for(int i = 0; i < s1.size(); i++){
      |                        ~~^~~~~~~~~~~
miners.cpp:182:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  182 |         for(int i = 0; i < s2.size(); i++){
      |                        ~~^~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 8 ms 324 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 31 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 165 ms 300 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 294 ms 308 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 212 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 324 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 352 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 596 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 3 ms 596 KB Output isn't correct
2 Halted 0 ms 0 KB -