QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#672763#7876. Cyclic Substringsgogo11ML 155ms396728kbC++203.3kb2024-10-24 18:48:492024-10-24 18:48:50

Judging History

你现在查看的是最新测评结果

  • [2024-10-24 18:48:50]
  • 评测
  • 测评结果:ML
  • 用时:155ms
  • 内存:396728kb
  • [2024-10-24 18:48:49]
  • 提交

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

result: