Submission #74672866


Source Code Expand

#include <bits/stdc++.h>
using namespace std;
#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define ll long long
#define se second
#define fi first
#define pb push_back
#define pf push_front
#define ld long double
#define INF 1e18
#define lcm(x, y) x / __gcd(x, y) * y
#define Pair pair<ll, ll>
#define pii pair<int, int>
#define Pq priority_queue<ll>
#define Pqr priority_queue<ll, vector<ll>, greater<ll >>
#define clockst clock_t tStart = clock()
#define clockfin printf("Time taken: %.2fs\n",(double)(clock() - tStart)/CLOCKS_PER_SEC)
#define all(x) x.begin(), x.end()
#define sz(x)((ll)(x).size())
#define eb emplace_back
#define mp make_pair
#define mems(a, x) memset((a),(x), sizeof(a))
//#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx2,popcnt,lzcnt,bmi,bmi2,fma")
typedef unsigned long long ull;
void init() { freopen("cf.INP", "r", stdin); freopen("cf.OUT", "w", stdout); }
ll xc[5] = { -1, 1, 0, 0 }, yc[5] = { 0, 0, 1, -1 };
ll xc8[8] = { -1, 1, 0, 0, -1, 1, -1, 1 };
ll yc8[8] = { 0, 0, 1, -1, -1, 1, 1, -1 };
const long double pi = acosl(-1.0L);
template<class T1, class T2> bool cmax(T1 &x, const T2 &y) { if(x < y) { x = y; return 1; } return 0; }

inline ll read()
{
    ll x = 0;
    char ch = getchar();;
    bool str = 1;
    while(ch < '0' || ch > '9')
    {
        if(ch == '-') str = 0; ch = getchar();;
    }
    while(ch >= '0' && ch <= '9')
    {
        x =((x << 3) +(x << 1)) + ch - '0';
        ch = getchar();;
    }
    return str ? x : x;
}

struct seg {
    ll len, link;
    ll nxt[10];
};

vector<seg> st;
ll sz;

void precomp()
{
    st.clear();
    st.reserve(1000005);
    seg s0;
    s0.len = 0; s0.link = -1;
    fill(s0.nxt, s0.nxt + 10, -1);
    st.push_back(s0);
    sz = 1;
}

ll saex(ll last, ll c)
{
    if (st[last].nxt[c] != -1)
    {
        ll q = st[last].nxt[c];
        if (st[last].len + 1 == st[q].len)
        {
            return q;
        }
        ll clone = sz++;
        st.push_back(st[q]);
        st[clone].len = st[last].len + 1;
        ll p = last;
        while (p != -1 && st[p].nxt[c] == q)
        {
            st[p].nxt[c] = clone;
            p = st[p].link;
        }
        st[q].link = clone;
        return clone;
    }
    ll cur = sz++;
    seg ns;
    ns.len = st[last].len + 1;
    ns.link = -1;
    fill(ns.nxt, ns.nxt + 10, -1);
    st.push_back(ns);
    ll p = last;
    while (p != -1 && st[p].nxt[c] == -1)
    {
        st[p].nxt[c] = cur;
        p = st[p].link;
    }
    if (p == -1)
    {
        st[cur].link = 0;
    }
    else
    {
        ll q = st[p].nxt[c];
        if (st[p].len + 1 == st[q].len)
        {
            st[cur].link = q;
        }
        else
        {
            ll clone = sz++;
            st.pb(st[q]);
            st[clone].len = st[p].len + 1;
            while (p != -1 && st[p].nxt[c] == q)
            {
                st[p].nxt[c] = clone;
                p = st[p].link;
            }
            st[q].link = clone;
            st[cur].link = clone;
        }
    }
    return cur;
}

void solve()
{
    fast;
    ll n;
    cin >> n;
    vector<ll> a(n + 1);
    for (ll i = 1; i <= n; i++) cin >> a[i];
    vector<bool> ok(n + 2, 0);
    for (ll i = 1; i <= n; i++)
    {
        ll d = a[i];
        if (i + d - 1 > n) continue;
        bool good = 1;
        for (ll t = i; t < i + d; t++)
        {
            if (a[t] != d) { good = 0; break; }
        }
        ok[i] = good;
    }
    vector<ll> nxt(n + 2, -1);
    for (ll i = 1; i <= n; i++)
    {
        if (!ok[i]) continue;
        ll d = a[i];
        ll j = i + d;
        if (j <= n && a[j] != d && ok[j]) nxt[i] = j;
    }
    vector<vector<ll>> c(n + 2);
    vector<bool> hasp(n + 2, 0);
    for (ll i = 1; i <= n; i++)
    {
        if (!ok[i]) continue;
        if (nxt[i] != -1)
        {
            c[nxt[i]].pb(i);
            hasp[i] = 1;
        }
    }
    vector<ll> root;
    for (ll i = 1; i <= n; i++)
    {
        if (ok[i] && !hasp[i]) root.pb(i);
    }
    precomp();
    vector<ll> sid(n + 2, -1);
    stack<Pair> stk;
    for (ll r : root) stk.push({r, 0});
    while (!stk.empty())
    {
        auto k = stk.top(); stk.pop();
        auto u = k.fi;
        auto par_state = k.se;
        ll cur = saex(par_state, a[u] - 1);
        sid[u] = cur;
        for (ll v : c[u]) stk.push({v, cur});
    }
    vector<bool> term(sz, 0);
    for (ll i = 1; i <= n; i++)
    {
        if (ok[i] && sid[i] != -1) term[sid[i]] = 1;
    }
    vector<ll> order(sz);
    iota(order.begin(), order.end(), 0);
    sort(order.begin(), order.end(), [](ll a, ll b) {
        return st[a].len > st[b].len;
    });
    for (ll v : order)
    {
        if (term[v] && st[v].link != -1) term[st[v].link] = 1;
    }
    ll ans = 0;
    for (ll i = 1; i < sz; i++)
    {
        if (term[i]) ans += st[i].len - st[st[i].link].len;
    }
    cout << ans << '\n';
}

bool multest = 0;

int main()
{
    fast;
    ll t = 1;
    if(multest) cin >> t;
    while(t--) solve();
    return 0;
}

Submission Info

Submission Time
Task G - 221 Substring
User khanhdang2109
Language C++23 (Clang 21.1.0)
Score 600
Code Size 5241 Byte
Status AC
Exec Time 164 ms
Memory 85304 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 2
AC × 53
Set Name Test Cases
Sample 00-sample-01.txt, 00-sample-02.txt
All 00-sample-01.txt, 00-sample-02.txt, 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 01-26.txt, 01-27.txt, 01-28.txt, 01-29.txt, 01-30.txt, 01-31.txt, 01-32.txt, 01-33.txt, 01-34.txt, 01-35.txt, 01-36.txt, 01-37.txt, 01-38.txt, 01-39.txt, 01-40.txt, 01-41.txt, 01-42.txt, 01-43.txt, 01-44.txt, 01-45.txt, 01-46.txt, 01-47.txt, 01-48.txt, 01-49.txt, 01-50.txt, 01-51.txt
Case Name Status Exec Time Memory
00-sample-01.txt AC 2 ms 3040 KiB
00-sample-02.txt AC 1 ms 2936 KiB
01-01.txt AC 1 ms 3040 KiB
01-02.txt AC 1 ms 2996 KiB
01-03.txt AC 1 ms 3116 KiB
01-04.txt AC 1 ms 2996 KiB
01-05.txt AC 1 ms 3160 KiB
01-06.txt AC 1 ms 3052 KiB
01-07.txt AC 1 ms 2928 KiB
01-08.txt AC 1 ms 3100 KiB
01-09.txt AC 1 ms 3032 KiB
01-10.txt AC 1 ms 3044 KiB
01-11.txt AC 1 ms 2988 KiB
01-12.txt AC 1 ms 3128 KiB
01-13.txt AC 1 ms 3040 KiB
01-14.txt AC 1 ms 3040 KiB
01-15.txt AC 1 ms 3168 KiB
01-16.txt AC 1 ms 2996 KiB
01-17.txt AC 1 ms 3032 KiB
01-18.txt AC 1 ms 3040 KiB
01-19.txt AC 1 ms 3032 KiB
01-20.txt AC 92 ms 27760 KiB
01-21.txt AC 105 ms 36368 KiB
01-22.txt AC 94 ms 38308 KiB
01-23.txt AC 119 ms 70856 KiB
01-24.txt AC 161 ms 85204 KiB
01-25.txt AC 128 ms 60580 KiB
01-26.txt AC 111 ms 44596 KiB
01-27.txt AC 111 ms 52820 KiB
01-28.txt AC 108 ms 52692 KiB
01-29.txt AC 120 ms 52384 KiB
01-30.txt AC 100 ms 37044 KiB
01-31.txt AC 164 ms 85208 KiB
01-32.txt AC 164 ms 85304 KiB
01-33.txt AC 164 ms 85304 KiB
01-34.txt AC 140 ms 67040 KiB
01-35.txt AC 129 ms 58784 KiB
01-36.txt AC 132 ms 59572 KiB
01-37.txt AC 130 ms 59508 KiB
01-38.txt AC 125 ms 54260 KiB
01-39.txt AC 112 ms 44452 KiB
01-40.txt AC 113 ms 44404 KiB
01-41.txt AC 113 ms 44588 KiB
01-42.txt AC 109 ms 42420 KiB
01-43.txt AC 1 ms 3148 KiB
01-44.txt AC 1 ms 2992 KiB
01-45.txt AC 1 ms 3040 KiB
01-46.txt AC 2 ms 3356 KiB
01-47.txt AC 2 ms 3416 KiB
01-48.txt AC 2 ms 3392 KiB
01-49.txt AC 98 ms 30132 KiB
01-50.txt AC 100 ms 33672 KiB
01-51.txt AC 96 ms 30848 KiB