QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#672763 | #7876. Cyclic Substrings | gogo11 | ML | 155ms | 396728kb | C++20 | 3.3kb | 2024-10-24 18:48:49 | 2024-10-24 18:48:50 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
constexpr int Mod=998244353;
constexpr int N=6000010;
struct PAM {
static constexpr int ALPHABET_SIZE = 10;
struct Node {
int len;
int link;
int cnt;
array<int, ALPHABET_SIZE> next;
Node() : len{}, link{}, cnt{}, next{} {}
};
vector<Node> t;
int suff;
string s;
PAM() {
init();
}
void init() {
t.reserve(6000010);
t.assign(2, Node());
t[0].len = -1;
suff = 1;
s.clear();
}
int newNode() {
t.emplace_back();
return t.size() - 1;
}
bool add(char c) {
int pos = s.size();
s += c;
int let = c - '0';
int cur = suff, curlen = 0;
while (true) {
curlen = t[cur].len;
if (pos - 1 - curlen >= 0 && s[pos - 1 - curlen] == s[pos]) {
break;
}
cur = t[cur].link;
}
if (t[cur].next[let]) {
suff = t[cur].next[let];
return false;
}
int num = newNode();
suff = num;
t[num].len = t[cur].len + 2;
t[cur].next[let] = num;
if (t[num].len == 1) {
t[num].link = 1;
t[num].cnt = 1;
return true;
}
while (true) {
cur = t[cur].link;
curlen = t[cur].len;
if (pos - 1 - curlen >= 0 && s[pos - 1 - curlen] == s[pos]) {
t[num].link = t[cur].next[let];
break;
}
}
t[num].cnt = 1 + t[t[num].link].cnt;
return true;
}
int next(int p, int x) {
return t[p].next[x];
}
int link(int p) {
return t[p].link;
}
int len(int p) {
return t[p].len;
}
int size() {
return t.size();
}
}pam;
void Add(int &a,int b) {
a+=b;
if(a>=Mod) a-=Mod;
}
int add(int a,int b) {
Add(a,b);
return a;
}
void Mul(int &a,int b) {
a=1LL*a*b%Mod;
}
int mul(int a,int b) {
Mul(a,b);
return a;
}
int ans=0,n;
vector<int> adj[N],f1,f2;
void dfs1(int u) {
for(int v: adj[u]) {
dfs1(v);
f1[u]+=f1[v];
}
}
void dfs2(int u) {
for(int v: adj[u]) {
dfs2(v);
f2[u]+=f2[v];
}
if(pam.len(u)<=n) Add(ans,mul(pam.len(u),mul(f2[u]-f1[u],f2[u]-f1[u])));
};
void solve() {
cin>>n;
string s;
cin>>s;
vector<int> ends;
for(auto ch: s) {
pam.add(ch);
ends.push_back(pam.suff);
}
int x1=pam.size();
f1.resize(x1*2);
for(int v: ends)
f1[v]++;
for(int i=2;i<x1;i++) {
adj[pam.link(i)].push_back(i);
}
dfs1(1);
for(auto ch: s) {
pam.add(ch);
ends.push_back(pam.suff);
}
int x2=pam.size();
f2.resize(x2);
for(int v: ends)
f2[v]++;
for(int i=x1;i<x2;i++) {
adj[pam.link(i)].push_back(i);
}
dfs2(1);
cout<<ans<<"\n";
}
int main() {
ios::sync_with_stdio(false),cin.tie(0);
// freopen("in","r",stdin);
// freopen("out","w",stdout);
int _=1;
// cin>>_;
while(_--)
solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 6ms
memory: 3548kb
input:
5 01010
output:
39
result:
ok 1 number(s): "39"
Test #2:
score: 0
Accepted
time: 5ms
memory: 3756kb
input:
8 66776677
output:
192
result:
ok 1 number(s): "192"
Test #3:
score: 0
Accepted
time: 5ms
memory: 3840kb
input:
1 1
output:
1
result:
ok 1 number(s): "1"
Test #4:
score: 0
Accepted
time: 5ms
memory: 3600kb
input:
2 22
output:
12
result:
ok 1 number(s): "12"
Test #5:
score: 0
Accepted
time: 5ms
memory: 3624kb
input:
2 21
output:
2
result:
ok 1 number(s): "2"
Test #6:
score: 0
Accepted
time: 5ms
memory: 3828kb
input:
3 233
output:
10
result:
ok 1 number(s): "10"
Test #7:
score: 0
Accepted
time: 5ms
memory: 3604kb
input:
3 666
output:
54
result:
ok 1 number(s): "54"
Test #8:
score: 0
Accepted
time: 155ms
memory: 396728kb
input:
1000000 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333...
output:
496166704
result:
ok 1 number(s): "496166704"
Test #9:
score: -100
Memory Limit Exceeded
input:
3000000 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222...
output:
890701718