QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#304355#7876. Cyclic Substringsucup-team134#ML 156ms623760kbC++142.2kb2024-01-13 18:22:322024-01-13 18:22:33

Judging History

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

  • [2024-01-13 18:22:33]
  • 评测
  • 测评结果:ML
  • 用时:156ms
  • 内存:623760kb
  • [2024-01-13 18:22:32]
  • 提交

answer

#include<bits/stdc++.h>
#define ff first
#define ss second
#define pb push_back
typedef long long ll;
using namespace std;
using u128=__uint128_t;
typedef pair<int,int> pii;

const int mod=998244353;
inline int add(int x,int y){int ret=x+y;if(ret>=mod)ret-=mod;return ret;}
inline int sub(int x,int y){int ret=x-y;if(ret<0)ret+=mod;return ret;}
inline int mul(int x,int y){return ((ll)x*y)%mod;}
inline int step(int base,int pw){int ret=1;while(pw){if(pw&1)ret=mul(ret,base);base=mul(base,base);pw>>=1;}return ret;}
inline int invv(int x){return step(x,mod-2);}

const int maxn=6e6+10;
const int maxalp=10;

int link[maxn],trans[maxn][maxalp],last,cnt,sum[maxn],len[maxn];
string s;

void init(){

    memset(trans,-1,sizeof(trans));
    last=1;
    cnt=2;
    link[0]=0;
    link[1]=0;
    len[0]=-1;
    len[1]=0;

}
void append(int pos,int val,int c){

   // printf("%d %d AFA\n",pos,val);

    int curr=last;
    while(1){
        if(pos-len[curr]-1>=0 && s[pos-len[curr]-1]==s[pos])break;
        curr=link[curr];
    }

    int q=trans[curr][c];
    if(q!=-1){
        last=q;
        sum[q]+=val;
        return;
    }

    q=cnt++;
    len[q]=len[curr]+2;
    last=q;
    sum[q]+=val;
    trans[curr][c]=q;

    curr=link[curr];
    while(1){
        if(pos-len[curr]-1>=0 && s[pos-len[curr]-1]==s[pos])break;
        curr=link[curr];
    }

    if(trans[curr][c]==q)link[q]=1;
    else link[q]=trans[curr][c];

}

vector<int>vect[maxn];
int n,cn;
int go(int x,int &rez){

    int sz=sum[x];
    for(int i=0;i<vect[x].size();i++){
        int id=vect[x][i];
        sz+=go(id,rez);
    }

   /// printf("%d %d %d AAAAAA\n",x,len[x],sz);

    if(len[x]>cn || x<=1)return sz;

    rez=add(rez, mul(len[x], mul(sz,sz) ) );

    return sz;
}

int main(){

    ///freopen("test.txt","r",stdin);

    scanf("%d",&n);
    cin>>s;
    s+=s;
    cn=n;
    n*=2;

    init();

    for(int i=0;i<s.size();i++)
        append(i,i>=cn,s[i]-'0');

    for(int i=1;i<cnt;i++){
       /// printf("%d %d AAA\n",link[i],i);
        vect[link[i]].pb(i);
    }

    int rez=0;
    go(0,rez);

    printf("%d\n",rez);

    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 19ms
memory: 380716kb

input:

5
01010

output:

39

result:

ok 1 number(s): "39"

Test #2:

score: 0
Accepted
time: 24ms
memory: 380672kb

input:

8
66776677

output:

192

result:

ok 1 number(s): "192"

Test #3:

score: 0
Accepted
time: 27ms
memory: 382760kb

input:

1
1

output:

1

result:

ok 1 number(s): "1"

Test #4:

score: 0
Accepted
time: 27ms
memory: 382772kb

input:

2
22

output:

12

result:

ok 1 number(s): "12"

Test #5:

score: 0
Accepted
time: 28ms
memory: 380620kb

input:

2
21

output:

2

result:

ok 1 number(s): "2"

Test #6:

score: 0
Accepted
time: 27ms
memory: 380692kb

input:

3
233

output:

10

result:

ok 1 number(s): "10"

Test #7:

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

input:

3
666

output:

54

result:

ok 1 number(s): "54"

Test #8:

score: 0
Accepted
time: 156ms
memory: 623760kb

input:

1000000
3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333...

output:

496166704

result:

ok 1 number(s): "496166704"

Test #9:

score: -100
Memory Limit Exceeded

input:

3000000
2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222...

output:

890701718

result: