제출 #1333080

#제출 시각아이디문제언어결과실행 시간메모리
1333080aaaaaaaaMoney (IZhO17_money)C++20
25 / 100
230 ms1716 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

const int MOD1 = 1e9 + 9;
const int MOD2 = 998244353;

struct pair_hash {
    template <class T1, class T2>
    std::size_t operator() (const std::pair<T1, T2>& pair) const {
        auto hash1 = std::hash<T1>{}(pair.first);
        auto hash2 = std::hash<T2>{}(pair.second);
        return hash1 ^ (hash2 << 1);
    }
};

struct sub_hash
{
    vector<int> dp1, dp2, inv1, inv2;

    int pw(int n, int k, int m){
        int ans = 1;
        while(k > 0){
            if(k & 1) ans = (ans * n) % m;
            n = (n * n) % m;
            k >>= 1;
        }
        return ans;
    }

    pair<int, int> query(int i, int j){
        int f = (dp1[j + 1] - dp1[i] + MOD1) % MOD1 * inv1[i] % MOD1;
        int s = (dp2[j + 1] - dp2[i] + MOD2) % MOD2 * inv2[i] % MOD2;
        return {f, s};
    }

    void init(vector<int> vec){
        int p = 31, p1 = 1, p2 = 1, n = (int) vec.size();
        dp1.resize(n + 5);
        dp2.resize(n + 5);
        inv1.resize(n + 5);
        inv2.resize(n + 5);
        for(int i = 0; i < n; ++i){
            dp1[i + 1] = (dp1[i] + (vec[i] - '0' + 1) * p1 % MOD1) % MOD1;
            dp2[i + 1] = (dp2[i] + (vec[i] - '0' + 1) * p2 % MOD2) % MOD2;
            p1 = p1 * p % MOD1;
            p2 = p2 * p % MOD2;
        }
        inv1[n - 1] = pw(pw(p, n - 1, MOD1), MOD1 - 2, MOD1);
        inv2[n - 1] = pw(pw(p, n - 1, MOD2), MOD2 - 2, MOD2);
        for(int i = n - 2; i >= 0; --i){
            inv1[i] = inv1[i + 1] * p % MOD1;
            inv2[i] = inv2[i + 1] * p % MOD2;
        }
    }

} hsh_on;

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

    int n, ans = 0;
    cin >> n;

    vector<int> a(n, 0), srt;

    for(int i = 0; i < n; ++i){
        cin >> a[i];
    }


    vector<int> dp(n + 5, 0);

    hsh_on.init(a);

   for(int z = 0; z < n; ++z){
     srt.push_back(a[z]);
     sort(srt.begin(), srt.end());

     sub_hash hsh_srt;
     hsh_srt.init(srt);

        map<pair<int, int>, bool> mp;

        for(int i = 0; i < (int) srt.size(); ++i){
            for(int j = i; j < (int) srt.size(); ++j){
                mp[hsh_srt.query(i, j)] = 1;
            }
        }

        int st = 0, en = z, j = z;

        while(st <= en){
            int mid = st + (en - st) / 2;
            pair<int, int> qry = hsh_on.query(mid, (int) z);
            if(mp.count(qry)){
                j = mid;
                en = mid - 1;
            }else{
                st = mid + 1;
            }
        }

        dp[z] = (j == 0 ? 0 : dp[j - 1]) + 1;

   }


   cout << dp[n - 1] << "\n";




    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...