QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#638696 | #7876. Cyclic Substrings | Winding# | WA | 0ms | 3548kb | C++23 | 2.0kb | 2024-10-13 16:38:40 | 2024-10-13 16:38:41 |
Judging History
answer
//
// Created by wind on 24-10-13.
//
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 3e6 + 10, mod = 998244353;
struct pam{
int sz, tot, last;
int cnt[N], ch[N][26], len[N], fail[N];
char s[N];
int node(int l)
{
sz ++;
memset(ch[sz], 0, sizeof (ch[sz]));
len[sz] = 1;
fail[sz] = cnt[sz] = 0;
return sz;
}
void clear()
{
sz = -1;
last = 0;
s[tot = 0] = '$';
node(0);
node(-1);
fail[0] = 1;
}
int getfail(int x)
{
while(s[tot - len[x] - 1] != s[tot])
x = fail[x];
return x;
}
void insert(char c) {
s[++tot] = c;
int now = getfail(last);
if (!ch[now][c - 'a']) {
int x = node(len[now] + 2);
fail[x] = ch[getfail(fail[now])][c - 'a'];
ch[now][c - 'a'] = x;
}
last = ch[now][c - 'a'];
cnt[last]++;
}
int work(int op)
{
int ans = 0;
for(int i = sz; i >= 0; i --)
{
cnt[fail[i]] += cnt[i];
}
for(int i = 1; i <= sz; i ++)
{
if(op == 2 && len[i] >= tot) continue;
ans += 1ll * cnt[i] * cnt[i] % mod * len[i] % mod;
ans %= mod;
}
return ans;
}
};
void solve() {
int n;
cin >> n;
string s;
cin >> s;
string t = s + s;
exit(0);
pam p1, p2;
p1.clear(), p2.clear();
for(int i = 0; i < s.size(); i ++)
p1.insert(s[i]);
for(int i = 0; i < t.size(); i ++)
p2.insert(t[i]);
int ans = p2.work(2) - p1.work(1);
ans = (ans % mod + mod) % mod;
cout << ans << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
// cin >> t;
while (t--) {
solve();
}
return 0;
}
/*
5
01010
*/
详细
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 3548kb
input:
5 01010
output:
result:
wrong answer Answer contains longer sequence [length = 1], but output contains 0 elements