QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#598301 | #7876. Cyclic Substrings | Hirro | TL | 670ms | 729420kb | C++20 | 3.8kb | 2024-09-28 21:12:48 | 2024-09-28 21:12:50 |
Judging History
answer
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
const int N = 3e6 + 10;
const int mod = 998244353;
int i, j, n, m, k, l, a[N * 4], tree[N * 4][11], root, num, r, d[N * 4], wz, f[N * 4][24], pos[N * 4], g[N * 2], qz[30], x, y, lg[N * 2 + 1];
long long ans;
string s;
inline void update(int x)
{
for (int i = 1; i <= 23; ++i)
f[x][i] = f[f[x][i - 1]][i - 1];
}
inline int up(int x, int y)
{
if (!y) return x;
for (int i = lg[y]; i >= 0; i = lg[y])
x = f[x][i], y -= qz[i];
return x;
}
inline void dfs1(int x, int y, int dep, int hh)
{
for (int i = 0; i <= 10; ++i)
if (tree[x][i])
{
if (x == 0)
{
if (i == 10) dfs1(tree[x][i], 1, dep + 1, i);
else dfs1(tree[x][i], 0, dep + 1, i);
}
else dfs1(tree[x][i], y, dep + 1, i);
g[x] += g[tree[x][i]]; g[x] %= mod;
}
if (x && hh != 10)
{
if (y)
{
int gs = dep / 2; gs *= 2;
if (gs <= n)ans += 1ll * gs * g[x] % mod * g[x] % mod;
ans %= mod;
}
else
{
int gs = dep / 2 + (dep % 2 != 0); gs = gs * 2 - 1;
if (gs <= n)ans += 1ll * gs * g[x] % mod * g[x] % mod;
ans %= mod;
}
}
}
int main()
{
//freopen("1.in","r",stdin);
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
for (int i = 1; i <= N * 2; i++)lg[i] = lg[i - 1] + (1 << lg[i - 1] == i);
for (int i = 0; i <= N * 2; i++)lg[i]--;
cin >> n >> s;
a[0] = 0; a[++a[0]] = 10;
for (i = 1; i <= n; ++i)
{
a[++a[0]] = s[i - 1] - '0';
a[++a[0]] = 10;
}
for (i = 1; i <= n; ++i)
{
a[++a[0]] = s[i - 1] - '0';
a[++a[0]] = 10;
}
qz[0] = 1;
for (i = 1; i <= 23; ++i) qz[i] = qz[i - 1] * 2;
root = 0; num = 0;
for (i = 1, l = 1, r = 0; i <= 2 * n; ++i)
{
wz = root;
if (!tree[wz][a[i]]) {
tree[wz][a[i]] = ++num;
f[num][0] = wz;
update(num);
}
wz = tree[root][a[i]];
if (i > r)
{
k = 1;
g[wz]++;
g[f[wz][0]]--;
}
else
{
if (d[l + r - i] <= r - i + 1)
{
k = d[l + r - i];
x = pos[l + r - i];
g[x]++;
g[f[wz][0]]--;
wz = x;
}
else
{
k = r - i + 1;
y = d[l + r - i] - (r - i + 1);
x = pos[l + r - i];
x = up(x, y);
g[x]++;
g[f[wz][0]]--;
wz = x;
}
}
while (1 <= i - k && i + k <= 4 * n + 2 && a[i - k] == a[i + k]) {
if (!tree[wz][a[i + k]])
{
tree[wz][a[i + k]] = ++num;
f[num][0] = wz;
update(num);
}
g[wz]--;
g[tree[wz][a[i + k]]]++;
wz = tree[wz][a[i + k]];
k++;
}
pos[i] = wz;
d[i] = k--;
if (i + k > r) {
l = i - k;
r = i + k;
}
}
for (i = 2 * n + 1, l = 1, r = 0; i <= 4 * n + 1; ++i)
{
wz = root;
if (!tree[wz][a[i]]) {
tree[wz][a[i]] = ++num;
f[num][0] = wz;
update(num);
}
wz = tree[root][a[i]];
if (i > r)
{
k = 1;
g[wz]++;
g[f[wz][0]]--;
}
else
{
if (d[l + r - i] <= r - i + 1)
{
k = d[l + r - i];
x = pos[l + r - i];
g[x]++;
g[f[wz][0]]--;
wz = x;
}
else
{
k = r - i + 1;
y = d[l + r - i] - (r - i + 1);
x = pos[l + r - i];
x = up(x, y);
g[x]++;
g[f[wz][0]]--;
wz = x;
}
}
while (1 <= i - k && i + k <= 4 * n + 2 && a[i - k] == a[i + k]) {
if (!tree[wz][a[i + k]])
{
tree[wz][a[i + k]] = ++num;
f[num][0] = wz;
update(num);
}
g[wz]--;
g[tree[wz][a[i + k]]]++;
wz = tree[wz][a[i + k]];
k++;
}
pos[i] = wz;
d[i] = k--;
int len = 0;
if (i - d[i] + 1 <= 2 * n) len = i - (2 * n);
else len = d[i];
x = pos[i]; y = d[i] - len;
x = up(x, y);
g[x]--;
if (i + k > r) {
l = i - k;
r = i + k;
}
}
dfs1(root, 0, 0, 10);
ans = (ans % mod + mod) % mod;
cout << ans << endl;
}
详细
Test #1:
score: 100
Accepted
time: 10ms
memory: 37456kb
input:
5 01010
output:
39
result:
ok 1 number(s): "39"
Test #2:
score: 0
Accepted
time: 13ms
memory: 38240kb
input:
8 66776677
output:
192
result:
ok 1 number(s): "192"
Test #3:
score: 0
Accepted
time: 10ms
memory: 38072kb
input:
1 1
output:
1
result:
ok 1 number(s): "1"
Test #4:
score: 0
Accepted
time: 18ms
memory: 39280kb
input:
2 22
output:
12
result:
ok 1 number(s): "12"
Test #5:
score: 0
Accepted
time: 13ms
memory: 38696kb
input:
2 21
output:
2
result:
ok 1 number(s): "2"
Test #6:
score: 0
Accepted
time: 13ms
memory: 39028kb
input:
3 233
output:
10
result:
ok 1 number(s): "10"
Test #7:
score: 0
Accepted
time: 7ms
memory: 38004kb
input:
3 666
output:
54
result:
ok 1 number(s): "54"
Test #8:
score: 0
Accepted
time: 670ms
memory: 729420kb
input:
1000000 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333...
output:
496166704
result:
ok 1 number(s): "496166704"
Test #9:
score: -100
Time Limit Exceeded
input:
3000000 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222...