QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#658060#7876. Cyclic Substrings333zhan#AC ✓626ms869516kbC++203.4kb2024-10-19 16:04:402024-10-19 16:04:42

Judging History

你现在查看的是最新测评结果

  • [2024-10-19 16:04:42]
  • 评测
  • 测评结果:AC
  • 用时:626ms
  • 内存:869516kb
  • [2024-10-19 16:04:40]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;

constexpr int mod = 998244353;

struct PAM {
    static constexpr int N = 10;
    struct Node {
        int len;
        int link;
        array <int, N> nxt;
        Node () : len {}, link {}, nxt {} {};
    };
    vector <Node> t;
    int suff;
    string s;
    PAM () {
        init ();
    }
    void init () {
        t.assign (2, Node ());
        t[0].len = -1;
        suff = 1;
        s.clear ();
    }
    int newNode () {
        t.emplace_back ();
        return t.size () - 1;
    }
    bool add (char c) {
        int pos = s.size ();
        s += c;
        int let = c - '0';
        int cur = suff, curlen = 0;
        while (true) {
            curlen = t[cur].len;
            if (pos - 1 - curlen >= 0 && s[pos - 1 - curlen] == s[pos]) {
                break;
            }
            cur = t[cur].link;
        }
        if (t[cur].nxt[let]) {
            suff = t[cur].nxt[let];
            return false;
        }
        int num = newNode ();
        suff = num;
        t[num].len = t[cur].len + 2;
        t[cur].nxt[let] = num;
        if (t[num].len == 1) {
            t[num].link = 1;
            return true;
        } 
        while (true) {
            cur = t[cur].link;
            curlen = t[cur].len;
            if (pos - 1 - curlen >= 0 && s[pos - 1 - curlen] == s[pos]) {
                t[num].link = t[cur].nxt[let];
                break;
            }
        }
        return true;
    }

    int nxt (int p, int x) {
        return t[p].nxt[x];
    }
    int link (int p) {
        return t[p].link;
    } 
    int len (int p) {
        return t[p].len;
    }
    int size () {
        return t.size ();
    }
};

using i64 = long long;

void solve () {
    int n;
    cin >> n;
    
    string s;
    cin >> s;

    PAM pam;
    vector <int> v;
    for (auto c : s) {
        pam.add (c);
        v.push_back (pam.suff);
    }
    
    int N = pam.size ();

    vector <int> f (N);
    for (auto x : v) {
        f[x] ++;
    }

    vector <vector <int>> e (N);
    for (int i = 2; i < N; i ++) {
        e[pam.link (i)].push_back (i);
    }

    auto dfs = [&](auto &&self, int x) -> void {
        for (auto y : e[x]) {
            self (self, y);
            f[x] += f[y];
        }
    };
    dfs (dfs, 1);

    for (auto &x : f) {
        x = -x;
    }

    for (auto c : s) {
        pam.add (c);
        v.push_back (pam.suff);
    }
    
    int M = N;
    N = pam.size ();

    vector <int> f2 (N);
    for (auto x : v) {
        f2[x] ++;
    }

    e.resize (N);
    for (int i = M; i < N; i ++) {
        e[pam.link (i)].push_back (i);
    }

    auto dfs2 = [&](auto &&self, int x) -> void {
        for (auto y : e[x]) {
            self (self, y);
            f2[x] += f2[y];
        }
    };
    dfs2 (dfs2, 1);

    i64 ans = 0;
    for (int i = 2; i < N; i ++) {
        if (pam.len (i) > n) {
            continue;
        }
        if (i < M) {
            f2[i] += f[i];
        }
        ans = (ans + 1LL * f2[i] * f2[i] % mod * pam.len (i) % mod) % mod;
    }

    cout << ans << '\n';
}

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

    int T = 1;
    // cin >> T;

    while (T --) {
        solve ();
    }
}

这程序好像有点Bug,我给组数据试试?

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3568kb

input:

5
01010

output:

39

result:

ok 1 number(s): "39"

Test #2:

score: 0
Accepted
time: 0ms
memory: 3516kb

input:

8
66776677

output:

192

result:

ok 1 number(s): "192"

Test #3:

score: 0
Accepted
time: 0ms
memory: 3572kb

input:

1
1

output:

1

result:

ok 1 number(s): "1"

Test #4:

score: 0
Accepted
time: 0ms
memory: 3660kb

input:

2
22

output:

12

result:

ok 1 number(s): "12"

Test #5:

score: 0
Accepted
time: 0ms
memory: 3564kb

input:

2
21

output:

2

result:

ok 1 number(s): "2"

Test #6:

score: 0
Accepted
time: 0ms
memory: 3612kb

input:

3
233

output:

10

result:

ok 1 number(s): "10"

Test #7:

score: 0
Accepted
time: 0ms
memory: 3864kb

input:

3
666

output:

54

result:

ok 1 number(s): "54"

Test #8:

score: 0
Accepted
time: 127ms
memory: 295184kb

input:

1000000
3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333...

output:

496166704

result:

ok 1 number(s): "496166704"

Test #9:

score: 0
Accepted
time: 382ms
memory: 869516kb

input:

3000000
2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222...

output:

890701718

result:

ok 1 number(s): "890701718"

Test #10:

score: 0
Accepted
time: 238ms
memory: 372900kb

input:

3000000
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999...

output:

224009870

result:

ok 1 number(s): "224009870"

Test #11:

score: 0
Accepted
time: 439ms
memory: 777724kb

input:

3000000
8989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989...

output:

51985943

result:

ok 1 number(s): "51985943"

Test #12:

score: 0
Accepted
time: 485ms
memory: 746064kb

input:

3000000
1911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911...

output:

355676465

result:

ok 1 number(s): "355676465"

Test #13:

score: 0
Accepted
time: 358ms
memory: 571004kb

input:

3000000
7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777...

output:

788510374

result:

ok 1 number(s): "788510374"

Test #14:

score: 0
Accepted
time: 304ms
memory: 604468kb

input:

3000000
5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555...

output:

691884476

result:

ok 1 number(s): "691884476"

Test #15:

score: 0
Accepted
time: 556ms
memory: 404256kb

input:

3000000
0990990909909909099090990990909909909099090990990909909099099090990990909909099099090990990909909099099090990909909909099099090990909909909099090990990909909909099090990990909909909099090990990909909099099090990990909909099099090990990909909099099090990909909909099099090990909909909099090990...

output:

701050848

result:

ok 1 number(s): "701050848"

Test #16:

score: 0
Accepted
time: 173ms
memory: 146244kb

input:

3000000
2772772727727727277272772772727727727277272772772727727277277272772772727727277277272772772727727277277272772727727727277277272772727727727277272772772727727727277272772772727727727277272772772727727277277272772772727727277277272772772727727277277272772727727727277277272772727727727277272772...

output:

486861605

result:

ok 1 number(s): "486861605"

Test #17:

score: 0
Accepted
time: 626ms
memory: 524556kb

input:

3000000
4554554545545545455454554554545545545455454554554545545455455454554554545545455455454554554545545455455454554545545545455455454554545545545455454554554545545545455454554554545545545455454554554545545455455454554554545545455455454554554545545455455454554545545545455455454554545545545455454554...

output:

450625621

result:

ok 1 number(s): "450625621"

Test #18:

score: 0
Accepted
time: 500ms
memory: 521844kb

input:

3000000
1181811811818118181181181811818118118181181181811818118118181181181811818118118181181811811818118118181181811811818118181181181811811818118181181181811811818118181181181811818118118181181181811818118118181181181811818118118181181811811818118118181181811811818118181181181811811818118181181181...

output:

649551870

result:

ok 1 number(s): "649551870"

Extra Test:

score: 0
Extra Test Passed