QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#657940#7876. Cyclic Substrings333zhan#ML 212ms398000kbC++203.6kb2024-10-19 15:49:032024-10-19 15:49:07

Judging History

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

  • [2024-10-19 15:49:07]
  • 评测
  • 测评结果:ML
  • 用时:212ms
  • 内存:398000kb
  • [2024-10-19 15:49:03]
  • 提交

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;
        int cnt;
        array <int, N> nxt;
        Node () : len {}, link {}, cnt {}, 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;
            t[num].cnt = 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;
            }
        }
        t[num].cnt = 1 + t[t[num].link].cnt;
        return true;
    }

    int cnt (int p) {
        return t[p].cnt;
    }
    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;

    s = s + s;

    PAM pam;
    vector <int> v;
    for (auto c : s) {
        pam.add (c);
        v.push_back (pam.suff);
    }
    
    const 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);
    }

    vector <int> len (N);

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

    pam.init ();
    vector <int> v2;
    for (int i = 0; i < n; i ++) {
        pam.add (s[i]);
        v2.push_back (pam.suff);
    }
    
    const int M = pam.size ();

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

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

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

    i64 ans = 0;
    for (int i = 2; i < N; i ++) {
        if (len[i] > n) {
            continue;
        }
        if (i < M) {
            f[i] -= f2[i];
        }
        ans = (ans + 1LL * f[i] * f[i] % mod * 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 ();
    }
}

詳細信息

Test #1:

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

input:

5
01010

output:

39

result:

ok 1 number(s): "39"

Test #2:

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

input:

8
66776677

output:

192

result:

ok 1 number(s): "192"

Test #3:

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

input:

1
1

output:

1

result:

ok 1 number(s): "1"

Test #4:

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

input:

2
22

output:

12

result:

ok 1 number(s): "12"

Test #5:

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

input:

2
21

output:

2

result:

ok 1 number(s): "2"

Test #6:

score: 0
Accepted
time: 1ms
memory: 3820kb

input:

3
233

output:

10

result:

ok 1 number(s): "10"

Test #7:

score: 0
Accepted
time: 1ms
memory: 3536kb

input:

3
666

output:

54

result:

ok 1 number(s): "54"

Test #8:

score: 0
Accepted
time: 212ms
memory: 398000kb

input:

1000000
3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333...

output:

496166704

result:

ok 1 number(s): "496166704"

Test #9:

score: -100
Memory Limit Exceeded

input:

3000000
2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222...

output:

890701718

result: