QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#642600#7876. Cyclic Substringsucup-team1001WA 65ms143340kbC++202.5kb2024-10-15 15:12:132024-10-15 15:12:15

Judging History

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

  • [2024-10-15 15:12:15]
  • 评测
  • 测评结果:WA
  • 用时:65ms
  • 内存:143340kb
  • [2024-10-15 15:12:13]
  • 提交

answer

#include "bits/stdc++.h"

using namespace std;
using i64 = long long;
i64 mod = 1e9 + 7;

// 回文自动机
// T 字符集大小 , base 字符集基数
template<size_t T = 26, size_t base = 'a'>
class PAM {
private:
    class Node {
    public:
        int next[T];
        int fail;
        int len;
        i64 cnt;

        int x;


        Node() {
            memset(next, 0, sizeof(next));
            fail = 0;
            len = 0;
            cnt = 0;
        }
    };

    string s;
    vector<Node> tree;
    int last;
    int lim;

    // 获取节点 , 节点指针指向 x , 字符串长度指针指向i
    int getFail(int x, int i) {
//        cerr << i - tree[x].len + 1 << " " << i << " " << i - tree[x].len - 1 << endl;
        while (i - tree[x].len + 1 >= 2 && s[i] != s[i - tree[x].len - 1]) {
            x = tree[x].fail;
        }
        return x;
    }

    int newNode(int len, int p) {
//        cerr << len << " " << p << endl;
        tree.push_back(Node());
        tree.back().len = len;
        tree.back().x = p;
        return tree.size() - 1;
    }

    void init() {
        tree.clear();
        newNode(0, -1);
        newNode(-1, -1);
        tree[0].fail = 1;
        last = 1;
    }

    void insert(int x, int i) {
        int p = getFail(last, i);
//        cerr << x << " " << i << endl;
        if (!tree[p].next[x]) {
            int np = newNode(tree[p].len + 2, x);
            tree[np].fail = tree[getFail(tree[p].fail, i)].next[x];
            tree[p].next[x] = np;
        }
        last = tree[p].next[x];
        if (i > lim) {
//            cerr << i << endl;
            tree[last].cnt++;
        }
    }

public:

    PAM(string _s, int lim) : s(_s), lim(lim) {
        init();
        s = "#" + s;
        for (int i = 1; i < s.size(); i++) {
            insert(s[i] - base, i);
        }
    }

    i64 solve() {
        i64 ans = 0;
        for (int i = tree.size() - 1; i >= 2; i--) {
            // 出现的次数
            tree[tree[i].fail].cnt += tree[i].cnt;
            tree[tree[i].fail].cnt %= mod;

            if (tree[i].len <= lim)
                ans = (ans + (tree[i].cnt * tree[i].len % mod * tree[i].cnt % mod)) % mod;
//            cerr << tree[i].len << " " << tree[i].cnt << " " << ans << endl;

        }
        return ans;
    }
};


int main() {
    int n;
    cin >> n;
    string s;
    cin >> s;
    s = s + s;
    PAM<10, '0'> pam(s, n);
    cout << pam.solve() << endl;
}

詳細信息

Test #1:

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

input:

5
01010

output:

39

result:

ok 1 number(s): "39"

Test #2:

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

input:

8
66776677

output:

192

result:

ok 1 number(s): "192"

Test #3:

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

input:

1
1

output:

1

result:

ok 1 number(s): "1"

Test #4:

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

input:

2
22

output:

12

result:

ok 1 number(s): "12"

Test #5:

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

input:

2
21

output:

2

result:

ok 1 number(s): "2"

Test #6:

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

input:

3
233

output:

10

result:

ok 1 number(s): "10"

Test #7:

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

input:

3
666

output:

54

result:

ok 1 number(s): "54"

Test #8:

score: -100
Wrong Answer
time: 65ms
memory: 143340kb

input:

1000000
3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333...

output:

524500028

result:

wrong answer 1st numbers differ - expected: '496166704', found: '524500028'