QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#287816 | #7876. Cyclic Substrings | daniel14311531 | TL | 1ms | 12020kb | C++14 | 1.0kb | 2023-12-21 00:41:19 | 2023-12-21 00:41:19 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
const int mod = 998244353;
const int N = 3000010;
int n, ans = 0;
string s;
int tot = 1, fail[N * 2], len[N * 2], fa[N * 2];
int sz[N * 2];
int ch[N * 2][10], cur = 0;
int gfail(int x, int now) {
for(; now - len[x] - 1 < 1 || s[now - len[x] - 1] != s[now]; x = fail[x]);
return x;
}
void insert(int now, int c) {
int pos = gfail(cur, now);
if(!ch[pos][c]) {
++tot;
fail[tot] = ch[gfail(fail[pos], now)][c];
ch[pos][c] = tot, len[tot] = len[pos] + 2, fa[tot] = pos;
}
cur = ch[pos][c];
if(now > n) ++sz[cur];
}
int main() {
ios::sync_with_stdio(0); cin.tie(nullptr);
cin >> n; cin >> s; s = "a" + s;
for(int i = 1; i <= n; i++) s = s + s[i];
len[0] = 0, len[1] = -1, fail[1] = 0, fail[0] = 1;
for(int i = 1; i <= n + n; i++) {
insert(i, s[i] - '0');
}
for(int i = tot; i > 1; i--) {
if(len[i] <= n) {
ans = (ans + 1ll * len[i] * sz[i] % mod * sz[i]) % mod;
}
sz[fail[i]] = (sz[fail[i]] + sz[i]) % mod;
}
cout << ans << "\n";
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 11756kb
input:
5 01010
output:
39
result:
ok 1 number(s): "39"
Test #2:
score: 0
Accepted
time: 0ms
memory: 12020kb
input:
8 66776677
output:
192
result:
ok 1 number(s): "192"
Test #3:
score: 0
Accepted
time: 1ms
memory: 11760kb
input:
1 1
output:
1
result:
ok 1 number(s): "1"
Test #4:
score: 0
Accepted
time: 1ms
memory: 11752kb
input:
2 22
output:
12
result:
ok 1 number(s): "12"
Test #5:
score: 0
Accepted
time: 1ms
memory: 11820kb
input:
2 21
output:
2
result:
ok 1 number(s): "2"
Test #6:
score: 0
Accepted
time: 1ms
memory: 11728kb
input:
3 233
output:
10
result:
ok 1 number(s): "10"
Test #7:
score: 0
Accepted
time: 1ms
memory: 11712kb
input:
3 666
output:
54
result:
ok 1 number(s): "54"
Test #8:
score: -100
Time Limit Exceeded
input:
1000000 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333...