QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#672771#7876. Cyclic Substringsgogo11AC ✓705ms988264kbC++203.2kb2024-10-24 18:53:342024-10-24 18:53:34

Judging History

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

  • [2024-10-24 18:53:34]
  • 评测
  • 测评结果:AC
  • 用时:705ms
  • 内存:988264kb
  • [2024-10-24 18:53:34]
  • 提交

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,link,cnt;
        array<int,ALPHABET_SIZE> next;
        Node():len{},link{},cnt{},next{} {}
    };
    vector<Node> t;
    int suff;
    string s;
    PAM() {init();}
    void init() {
        t.reserve(N);
        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 cnt(int p) {return t[p].cnt;}
    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;
}
void solve() {
    int n;
    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();
    vector<int> f1(N);
    for(int v: ends)
        f1[v]++;
    vector adj(N,vector<int>());
    for(int i=2;i<x1;i++) {
        adj[pam.link(i)].push_back(i);
    }
    auto dfs1=[&](auto &&dfs1,int u)->void {
        for(int v: adj[u]) {
            dfs1(dfs1,v);
            f1[u]+=f1[v];
        }
    };
    dfs1(dfs1,1);
    for(auto ch: s) {
        pam.add(ch);
        ends.push_back(pam.suff);
    }
    int x2=pam.size();
    vector<int> f2(N);
    for(int v: ends)
        f2[v]++;
    for(int i=x1;i<x2;i++) {
        adj[pam.link(i)].push_back(i);
    }
    int ans=0;
    auto dfs2=[&](auto &&dfs2,int u)->void {
        for(int v: adj[u]) {
            dfs2(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])));
    };
    dfs2(dfs2,1);
    cout<<ans<<"\n";
}
int main() {
    ios::sync_with_stdio(false),cin.tie(0);
    int _=1;
    // cin>>_;
    while(_--)
        solve();
    return 0;
}

这程序好像有点Bug,我给组数据试试?

详细

Test #1:

score: 100
Accepted
time: 15ms
memory: 190580kb

input:

5
01010

output:

39

result:

ok 1 number(s): "39"

Test #2:

score: 0
Accepted
time: 20ms
memory: 190644kb

input:

8
66776677

output:

192

result:

ok 1 number(s): "192"

Test #3:

score: 0
Accepted
time: 23ms
memory: 190628kb

input:

1
1

output:

1

result:

ok 1 number(s): "1"

Test #4:

score: 0
Accepted
time: 16ms
memory: 190580kb

input:

2
22

output:

12

result:

ok 1 number(s): "12"

Test #5:

score: 0
Accepted
time: 20ms
memory: 190512kb

input:

2
21

output:

2

result:

ok 1 number(s): "2"

Test #6:

score: 0
Accepted
time: 16ms
memory: 190624kb

input:

3
233

output:

10

result:

ok 1 number(s): "10"

Test #7:

score: 0
Accepted
time: 15ms
memory: 190556kb

input:

3
666

output:

54

result:

ok 1 number(s): "54"

Test #8:

score: 0
Accepted
time: 128ms
memory: 458824kb

input:

1000000
3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333...

output:

496166704

result:

ok 1 number(s): "496166704"

Test #9:

score: 0
Accepted
time: 341ms
memory: 988264kb

input:

3000000
2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222...

output:

890701718

result:

ok 1 number(s): "890701718"

Test #10:

score: 0
Accepted
time: 223ms
memory: 440608kb

input:

3000000
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999...

output:

224009870

result:

ok 1 number(s): "224009870"

Test #11:

score: 0
Accepted
time: 388ms
memory: 852104kb

input:

3000000
8989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989...

output:

51985943

result:

ok 1 number(s): "51985943"

Test #12:

score: 0
Accepted
time: 471ms
memory: 807876kb

input:

3000000
1911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911...

output:

355676465

result:

ok 1 number(s): "355676465"

Test #13:

score: 0
Accepted
time: 297ms
memory: 638480kb

input:

3000000
7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777...

output:

788510374

result:

ok 1 number(s): "788510374"

Test #14:

score: 0
Accepted
time: 330ms
memory: 617744kb

input:

3000000
5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555...

output:

691884476

result:

ok 1 number(s): "691884476"

Test #15:

score: 0
Accepted
time: 704ms
memory: 431688kb

input:

3000000
0990990909909909099090990990909909909099090990990909909099099090990990909909099099090990990909909099099090990909909909099099090990909909909099090990990909909909099090990990909909909099090990990909909099099090990990909909099099090990990909909099099090990909909909099099090990909909909099090990...

output:

701050848

result:

ok 1 number(s): "701050848"

Test #16:

score: 0
Accepted
time: 256ms
memory: 289396kb

input:

3000000
2772772727727727277272772772727727727277272772772727727277277272772772727727277277272772772727727277277272772727727727277277272772727727727277272772772727727727277272772772727727727277272772772727727277277272772772727727277277272772772727727277277272772727727727277277272772727727727277272772...

output:

486861605

result:

ok 1 number(s): "486861605"

Test #17:

score: 0
Accepted
time: 705ms
memory: 557292kb

input:

3000000
4554554545545545455454554554545545545455454554554545545455455454554554545545455455454554554545545455455454554545545545455455454554545545545455454554554545545545455454554554545545545455454554554545545455455454554554545545455455454554554545545455455454554545545545455455454554545545545455454554...

output:

450625621

result:

ok 1 number(s): "450625621"

Test #18:

score: 0
Accepted
time: 620ms
memory: 548364kb

input:

3000000
1181811811818118181181181811818118118181181181811818118118181181181811818118118181181811811818118118181181811811818118181181181811811818118181181181811811818118181181181811818118118181181181811818118118181181181811818118118181181811811818118118181181811811818118181181181811811818118181181181...

output:

649551870

result:

ok 1 number(s): "649551870"

Extra Test:

score: 0
Extra Test Passed