QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#561121#7876. Cyclic SubstringsHJRAC ✓469ms782596kbC++232.4kb2024-09-12 20:22:132024-09-12 20:22:13

Judging History

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

  • [2024-09-12 20:22:13]
  • 评测
  • 测评结果:AC
  • 用时:469ms
  • 内存:782596kb
  • [2024-09-12 20:22:13]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
#define debug(x) cout<<#x<<": "<<x<<endl
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
using ll=long long;
using ull=unsigned long long;
// #define int long long
const int mo=998244353;
const int N=6e6+10;
const int NN=3e6+10;
    struct Node{
        int cnt;
        int len;
        int fail;
        char s;
        vector<int> next;
        Node() : cnt{}, len{}, fail{},s{}{next.assign(10,0);}
    }; 
Node t[N],tt[NN];
struct PAM {
    int sz, tot, last;
    PAM() {
        init();
    }
    void init() {
        sz=-1;
        tot=last=1;
        newnode(0);
        newnode(-1);
        t[0].s = '$';
        t[0].fail = 1;
    }


    int newnode(int l) {  // 建立一个新节点,长度为 l
        sz++;
        t[sz].len = l;
        t[sz].fail = t[sz].cnt = 0;
        return sz;
    }

    int getfail(int x) {  // 找后缀回文
        while (t[tot - t[x].len - 1].s != t[tot].s) x = t[x].fail;
        return x;
    }

    void insert(char c) {  // 建树
        t[++tot].s = c;
        int now = getfail(last);
        if (!t[now].next[c - '0']) {
            int x = newnode(t[now].len + 2);
            t[x].fail = t[getfail(t[now].fail)].next[c - '0'];
            t[now].next[c - '0'] = x;
        }
        last = t[now].next[c - '0'];
        t[last].cnt++;
    }
    void work(){
        for(int i=tot;i>=2;i--){
            t[t[i].fail].cnt+=t[i].cnt;
            t[t[i].fail].cnt%=mo;
        }
    }
};
void solve(){
    int n;
    cin>>n;
    string s;
    cin>>s;
    PAM pam;
    for(auto x:s){
        pam.insert(x);
    }
    for(int i=0;i<=pam.tot;i++)
        tt[i]=t[i];
    int cn=pam.tot;
    pam.work();
    for(int i=0;i<=pam.tot;i++)
        swap(tt[i],t[i]);  
    for(auto x:s){
        pam.insert(x);
    }
    pam.work();
    ll ans=0;
    for(int i=2;i<=pam.tot;i++){
        ll cnt=t[i].cnt,len=t[i].len;
        if(len>n)
            continue;
        if(i<=cn){
            cnt-=tt[i].cnt;
        }
        ans+=cnt*cnt%mo*len%mo;
        ans%=mo;
    }
    cout<<ans<<endl;
}
signed main(){
    ios::sync_with_stdio(0);
    cout.tie(0);
    cin.tie(0);
    int t=1;
    while(t--){
        solve();
    }
}
/*
贡献法
正难则反
数小状压
关系连边
拆位
广义单调性
*/

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

詳細信息

Test #1:

score: 100
Accepted
time: 244ms
memory: 777200kb

input:

5
01010

output:

39

result:

ok 1 number(s): "39"

Test #2:

score: 0
Accepted
time: 217ms
memory: 777212kb

input:

8
66776677

output:

192

result:

ok 1 number(s): "192"

Test #3:

score: 0
Accepted
time: 218ms
memory: 777216kb

input:

1
1

output:

1

result:

ok 1 number(s): "1"

Test #4:

score: 0
Accepted
time: 204ms
memory: 777248kb

input:

2
22

output:

12

result:

ok 1 number(s): "12"

Test #5:

score: 0
Accepted
time: 230ms
memory: 777244kb

input:

2
21

output:

2

result:

ok 1 number(s): "2"

Test #6:

score: 0
Accepted
time: 260ms
memory: 777064kb

input:

3
233

output:

10

result:

ok 1 number(s): "10"

Test #7:

score: 0
Accepted
time: 228ms
memory: 777008kb

input:

3
666

output:

54

result:

ok 1 number(s): "54"

Test #8:

score: 0
Accepted
time: 284ms
memory: 777620kb

input:

1000000
3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333...

output:

496166704

result:

ok 1 number(s): "496166704"

Test #9:

score: 0
Accepted
time: 446ms
memory: 781752kb

input:

3000000
2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222...

output:

890701718

result:

ok 1 number(s): "890701718"

Test #10:

score: 0
Accepted
time: 462ms
memory: 781488kb

input:

3000000
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999...

output:

224009870

result:

ok 1 number(s): "224009870"

Test #11:

score: 0
Accepted
time: 430ms
memory: 781896kb

input:

3000000
8989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989...

output:

51985943

result:

ok 1 number(s): "51985943"

Test #12:

score: 0
Accepted
time: 371ms
memory: 781828kb

input:

3000000
1911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911911...

output:

355676465

result:

ok 1 number(s): "355676465"

Test #13:

score: 0
Accepted
time: 469ms
memory: 782440kb

input:

3000000
7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777...

output:

788510374

result:

ok 1 number(s): "788510374"

Test #14:

score: 0
Accepted
time: 467ms
memory: 781252kb

input:

3000000
5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555...

output:

691884476

result:

ok 1 number(s): "691884476"

Test #15:

score: 0
Accepted
time: 432ms
memory: 782292kb

input:

3000000
0990990909909909099090990990909909909099090990990909909099099090990990909909099099090990990909909099099090990909909909099099090990909909909099090990990909909909099090990990909909909099090990990909909099099090990990909909099099090990990909909099099090990909909909099099090990909909909099090990...

output:

701050848

result:

ok 1 number(s): "701050848"

Test #16:

score: 0
Accepted
time: 433ms
memory: 782596kb

input:

3000000
2772772727727727277272772772727727727277272772772727727277277272772772727727277277272772772727727277277272772727727727277277272772727727727277272772772727727727277272772772727727727277272772772727727277277272772772727727277277272772772727727277277272772727727727277277272772727727727277272772...

output:

486861605

result:

ok 1 number(s): "486861605"

Test #17:

score: 0
Accepted
time: 435ms
memory: 782180kb

input:

3000000
4554554545545545455454554554545545545455454554554545545455455454554554545545455455454554554545545455455454554545545545455455454554545545545455454554554545545545455454554554545545545455454554554545545455455454554554545545455455454554554545545455455454554545545545455455454554545545545455454554...

output:

450625621

result:

ok 1 number(s): "450625621"

Test #18:

score: 0
Accepted
time: 460ms
memory: 781040kb

input:

3000000
1181811811818118181181181811818118118181181181811818118118181181181811818118118181181811811818118118181181811811818118181181181811811818118181181181811811818118181181181811818118118181181181811818118118181181181811818118118181181811811818118118181181811811818118181181181811811818118181181181...

output:

649551870

result:

ok 1 number(s): "649551870"

Extra Test:

score: 0
Extra Test Passed