Submission #74668256


Source Code Expand

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;

const int MAXN = 500005;
const int MAXS = 2 * MAXN;

int n, a[MAXN];
int pir[MAXN];
bool f[MAXN];
int st[MAXN];

int nxt[MAXS][10];
int lik[MAXS];
int len[MAXS];
int tot = 1;

int insert(int lst, int c)
{
    if (nxt[lst][c] && len[nxt[lst][c]] == len[lst] + 1)
        return nxt[lst][c];
    int cur = ++tot;
    len[cur] = len[lst] + 1;
    int p = lst;
    while (p && !nxt[p][c])
    {
        nxt[p][c] = cur;
        p = lik[p];
    }
    if (!p)
        lik[cur] = 1;
    else
    {
        int q = nxt[p][c];
        if (len[p] + 1 == len[q])
            lik[cur] = q;
        else
        {
            ++tot;
            len[tot] = len[p] + 1;
            memcpy(nxt[tot], nxt[q], sizeof(nxt[q]));
            lik[tot] = lik[q];
            while (p && nxt[p][c] == q)
            {
                nxt[p][c] = tot;
                p = lik[p];
            }
            lik[q] = lik[cur] = tot;
        }
    }
    return cur;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = 1; i <= n; i++)
    {
        int j = a[i];
        if (i + j - 1 > n)
        {
            f[i] = false;
            continue;
        }
        bool flag = true;
        for (int k = 0; k < j; k++)
        {
            if (a[i + k] != j)
            {
                flag = false;
                break;
            }
        }
        f[i] = flag;
    }
    for (int i = 1; i <= n; i++)
    {
        if (!f[i])
            continue;
        int nxti = i + a[i];
        if (nxti <= n && f[nxti] && a[i] != a[nxti])
            pir[i] = nxti;
        else
            pir[i] = 0;
    }
    lik[1] = 0;
    len[1] = 0;
    for (int i = n; i >= 1; i--)
    {
        if (!f[i])
            continue;
        int lst = (pir[i] == 0) ? 1 : st[pir[i]];
        st[i] = insert(lst, a[i] - 1);
    }
    long long ans = 0;
    for (int i = 2; i <= tot; i++)
        ans += len[i] - len[lik[i]];
    cout << ans << endl;
    return 0;
}

Submission Info

Submission Time
Task G - 221 Substring
User xzy404
Language C++23 (GCC 15.2.0)
Score 600
Code Size 2204 Byte
Status AC
Exec Time 44 ms
Memory 33484 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 1 ms 3684 KiB
00-sample-02.txt AC 1 ms 3680 KiB
01-01.txt AC 1 ms 3724 KiB
01-02.txt AC 1 ms 3692 KiB
01-03.txt AC 1 ms 3728 KiB
01-04.txt AC 1 ms 3704 KiB
01-05.txt AC 1 ms 3644 KiB
01-06.txt AC 1 ms 3692 KiB
01-07.txt AC 1 ms 3736 KiB
01-08.txt AC 1 ms 3728 KiB
01-09.txt AC 1 ms 3704 KiB
01-10.txt AC 1 ms 3752 KiB
01-11.txt AC 1 ms 3644 KiB
01-12.txt AC 1 ms 3636 KiB
01-13.txt AC 1 ms 3692 KiB
01-14.txt AC 1 ms 3716 KiB
01-15.txt AC 1 ms 3752 KiB
01-16.txt AC 1 ms 3644 KiB
01-17.txt AC 1 ms 3644 KiB
01-18.txt AC 1 ms 3752 KiB
01-19.txt AC 1 ms 3644 KiB
01-20.txt AC 17 ms 10000 KiB
01-21.txt AC 21 ms 9908 KiB
01-22.txt AC 18 ms 9920 KiB
01-23.txt AC 25 ms 25580 KiB
01-24.txt AC 42 ms 33400 KiB
01-25.txt AC 29 ms 22732 KiB
01-26.txt AC 24 ms 16844 KiB
01-27.txt AC 21 ms 19004 KiB
01-28.txt AC 21 ms 17296 KiB
01-29.txt AC 23 ms 20728 KiB
01-30.txt AC 17 ms 10104 KiB
01-31.txt AC 44 ms 33340 KiB
01-32.txt AC 44 ms 33484 KiB
01-33.txt AC 41 ms 33348 KiB
01-34.txt AC 33 ms 25464 KiB
01-35.txt AC 28 ms 23268 KiB
01-36.txt AC 28 ms 22312 KiB
01-37.txt AC 30 ms 24592 KiB
01-38.txt AC 30 ms 21588 KiB
01-39.txt AC 25 ms 16708 KiB
01-40.txt AC 25 ms 16708 KiB
01-41.txt AC 25 ms 16832 KiB
01-42.txt AC 24 ms 15804 KiB
01-43.txt AC 1 ms 3692 KiB
01-44.txt AC 1 ms 3636 KiB
01-45.txt AC 1 ms 3704 KiB
01-46.txt AC 2 ms 3724 KiB
01-47.txt AC 1 ms 3648 KiB
01-48.txt AC 1 ms 3704 KiB
01-49.txt AC 20 ms 10812 KiB
01-50.txt AC 21 ms 11100 KiB
01-51.txt AC 20 ms 10316 KiB