QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#649203 | #7876. Cyclic Substrings | Tmonkey | ML | 585ms | 936000kb | C++20 | 5.1kb | 2024-10-17 22:03:56 | 2024-10-17 22:03:56 |
Judging History
answer
#include <bits/stdc++.h>
#define int long long
using namespace std;
#define YES "YES"
#define NO "NO"
#define all(a) a.begin(), a.end()
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
const double eps = 1e-9;
const int N = 3e6 + 100;
const int M = 4e6 + 100;
const int INF = 1e16 + 100;
const int mod = 998244353;
const int base = 23333;
mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());
int n, cnt, ans, flag = 1;
string s;
int d[N + N / 2];
int nxt[M][22];
int lef[N + N / 2];
struct node
{
int son[10], num = 0, add = 0, h = 0, fa = 0, deg = 0;
} trie[M];
void topu()
{
queue<int> q;
for (int i = 0; i <= cnt; i++)
{
if (trie[i].deg == 0)
q.push(i);
}
while (!q.empty())
{
int u = q.front();
q.pop();
int v = trie[u].fa;
trie[v].add = (trie[v].add + trie[u].add) % mod;
trie[v].deg--;
if (trie[v].deg == 0)
q.push(v);
trie[u].num = (trie[u].num + trie[u].add) % mod;
if (flag)
ans = (ans + trie[u].num * trie[u].num % mod * (max(0ll, 2 * trie[u].h - 1)) % mod) % mod;
else
ans = (ans + trie[u].num * trie[u].num % mod * (2 * trie[u].h) % mod) % mod;
}
}
void clear()
{
for (int i = 0; i <= cnt; i++)
{
for (int j = 0; j < 10; j++)
{
trie[i].son[j] = 0;
}
trie[i].add = trie[i].deg = trie[i].fa = trie[i].h = trie[i].num = 0;
}
}
int get(int u, int k)
{
int i = 0;
while (k)
{
if (k & 1)
u = nxt[u][i];
k = k >> 1;
i++;
}
return u;
}
void solve()
{
cin >> n;
cin >> s;
s = s + s;
// 奇数
// n = 5;
// s = "";
// for (int i = 1; i <= 5; i++)
// {
// s += '0' + rng() % 10;
// }
// cout << s << '\n';
// s = s + s;
// printf("YES\n");
for (int i = 0, l = 0, r = -1; i < n + n / 2; i++)
{
int k = 0, pos = 0;
if (i <= r)
{
k = min(d[l + r - i], r - i + 1);
pos = lef[l + r - i];
if (d[l + r - i] > r - i + 1)
pos = get(pos, trie[pos].h - (r - i + 1));
}
if (pos)
trie[pos].add++;
while (0 <= i - k && i + k < 2 * n && k < (n + 1) / 2 && s[i - k] == s[i + k])
{
int v = s[i + k] - '0';
if (!trie[pos].son[v])
{
trie[pos].son[v] = ++cnt;
trie[pos].deg++;
}
int x = trie[pos].son[v];
trie[x].fa = pos;
trie[x].num++;
trie[x].h = trie[pos].h + 1;
// update
if (nxt[x][0] == 0)
{
nxt[x][0] = pos;
for (int j = 1; j < 22; j++)
{
nxt[x][j] = nxt[nxt[x][j - 1]][j - 1];
}
}
pos = trie[pos].son[v];
k++;
}
d[i] = k--;
lef[i] = pos;
if (i + k > r)
{
l = i - k;
r = i + k;
}
}
for (int i = 0; i < n / 2; i++)
{
trie[lef[i]].add = (trie[lef[i]].add + mod - 1) % mod;
}
// printf("YES\n");
topu();
clear();
flag = 0;
// printf("YES\n");
// 偶数
cnt = 0;
for (int i = 0, l = 0, r = -1; i < n + n / 2; i++)
{
int k = 0, pos = 0;
if (i <= r)
{
k = min(d[l + r - i + 1], r - i + 1);
pos = lef[l + r - i + 1];
if (d[l + r - i + 1] > r - i + 1)
pos = get(pos, trie[pos].h - (r - i + 1));
}
if (pos)
trie[pos].add++;
while (0 <= i - k - 1 && i + k < 2 * n && k < n / 2 && s[i - k - 1] == s[i + k])
{
int v = s[i + k] - '0';
if (!trie[pos].son[v])
{
trie[pos].son[v] = ++cnt;
trie[pos].deg++;
}
int x = trie[pos].son[v];
trie[x].fa = pos;
trie[x].num++;
trie[x].h = trie[pos].h + 1;
// update
if (nxt[x][0] == 0)
{
nxt[x][0] = pos;
for (int j = 1; j < 22; j++)
{
nxt[x][j] = nxt[nxt[x][j - 1]][j - 1];
}
}
pos = trie[pos].son[v];
k++;
}
d[i] = k--;
lef[i] = pos;
if (i + k > r)
{
l = i - k - 1;
r = i + k;
}
}
for (int i = 0; i < n / 2; i++)
{
trie[lef[i]].add = (trie[lef[i]].add + mod - 1) % mod;
}
topu();
cout << ans << '\n';
// printf("%lld\n", ans);
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t = 1;
// cin >> t;
while (t--)
solve();
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 43ms
memory: 472412kb
input:
5 01010
output:
39
result:
ok 1 number(s): "39"
Test #2:
score: 0
Accepted
time: 24ms
memory: 472580kb
input:
8 66776677
output:
192
result:
ok 1 number(s): "192"
Test #3:
score: 0
Accepted
time: 16ms
memory: 472652kb
input:
1 1
output:
1
result:
ok 1 number(s): "1"
Test #4:
score: 0
Accepted
time: 27ms
memory: 472648kb
input:
2 22
output:
12
result:
ok 1 number(s): "12"
Test #5:
score: 0
Accepted
time: 35ms
memory: 472416kb
input:
2 21
output:
2
result:
ok 1 number(s): "2"
Test #6:
score: 0
Accepted
time: 23ms
memory: 472452kb
input:
3 233
output:
10
result:
ok 1 number(s): "10"
Test #7:
score: 0
Accepted
time: 8ms
memory: 472368kb
input:
3 666
output:
54
result:
ok 1 number(s): "54"
Test #8:
score: 0
Accepted
time: 167ms
memory: 583508kb
input:
1000000 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333...
output:
496166704
result:
ok 1 number(s): "496166704"
Test #9:
score: 0
Accepted
time: 515ms
memory: 806180kb
input:
3000000 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222...
output:
890701718
result:
ok 1 number(s): "890701718"
Test #10:
score: 0
Accepted
time: 585ms
memory: 936000kb
input:
3000000 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999...
output:
224009870
result:
ok 1 number(s): "224009870"
Test #11:
score: -100
Memory Limit Exceeded
input:
3000000 8989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989...
output:
51985943