QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#646970#7876. Cyclic SubstringsSGColinWA 31ms114584kbC++172.0kb2024-10-17 10:38:102024-10-17 10:38:10

Judging History

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

  • [2024-10-17 10:38:10]
  • 评测
  • 测评结果:WA
  • 用时:31ms
  • 内存:114584kb
  • [2024-10-17 10:38:10]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

#define eb emplace_back
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define per(i, a, b) for (int i = (a); i >= (b); --i)

const int N = 2000001;

const int mod = 998244353;

int n, ans = 0;

struct Palindromic_AutoMaton {
    vector<int> str;
    int nxt[N][10], fail[N], len[N];   
    int num[N], last, tot;
    void clear() {
        len[1] = -1; fail[1] = 0;
        len[0] = 0; fail[0] = 1;
        str.clear(); str.eb(-1);
        last = 0; tot = 1;
        memset(nxt[0], 0, sizeof(nxt[0]));
        memset(nxt[1], 0, sizeof(nxt[1]));
    }
    Palindromic_AutoMaton(){clear();}
    int newnode(int _len) {
        len[++tot] = _len;
        fail[tot] = num[tot] = 0; 
        memset(nxt[tot], 0, sizeof(nxt[tot]));
        return tot;
    }
    int get_fail(int u) {
        int strlen = str.size() - 1;
        while (str[strlen - len[u] - 1] != str[strlen]) u = fail[u];
        return u;
    }
    void append(int ch, int w) {
        str.emplace_back(ch);
        int fat = get_fail(last);
        if (!nxt[fat][ch]) {
            int cur = newnode(len[fat] + 2);
            fail[cur] = nxt[get_fail(fail[fat])][ch];
            nxt[fat][ch] = cur; 
        }
        last = nxt[fat][ch];
        num[last] += w;
    }
    void append(string &s, int w) {
        for (auto &ch : s) append(ch - '0', w);
    }
    // void add(string &s) {
    //     last = 0;
    //     append(s);
    // }
    void get_num() {
        per(u, tot, 2) num[fail[u]] += num[u];
        num[0] = num[1] = 0;
    }
    void calc() {
        rep(u, 2, tot) if (len[u] <= n) {
            int w = 1ll * num[u] * num[u] % mod * len[u] % mod;
            ans = (ans + w) % mod;
        }
    }
} pam;

int main() {
    cin.tie(0);
    ios::sync_with_stdio();
    cin >> n;
    string s; cin >> s;
    pam.append(s, 0);
    pam.append(s, 1);
    pam.get_num();
    pam.calc();
    cout << ans;
    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 9688kb

input:

5
01010

output:

39

result:

ok 1 number(s): "39"

Test #2:

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

input:

8
66776677

output:

192

result:

ok 1 number(s): "192"

Test #3:

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

input:

1
1

output:

1

result:

ok 1 number(s): "1"

Test #4:

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

input:

2
22

output:

12

result:

ok 1 number(s): "12"

Test #5:

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

input:

2
21

output:

2

result:

ok 1 number(s): "2"

Test #6:

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

input:

3
233

output:

10

result:

ok 1 number(s): "10"

Test #7:

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

input:

3
666

output:

54

result:

ok 1 number(s): "54"

Test #8:

score: -100
Wrong Answer
time: 31ms
memory: 114584kb

input:

1000000
3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333...

output:

411249645

result:

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