QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#304362#7876. Cyclic Substringsucup-team134#ML 139ms637908kbC++142.3kb2024-01-13 18:30:112024-01-13 18:30:12

Judging History

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

  • [2024-01-13 18:30:12]
  • 评测
  • 测评结果:ML
  • 用时:139ms
  • 内存:637908kb
  • [2024-01-13 18:30:11]
  • 提交

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 pos[maxn];
int go(int x,int &rez){

    int sz=sum[x];
    if(pos[x]==1){
        while(1){}
    }
    pos[x]=1;
    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);

    ///printf("%d ADA\n",sizeof(vect));

    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;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 31ms
memory: 384712kb

input:

5
01010

output:

39

result:

ok 1 number(s): "39"

Test #2:

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

input:

8
66776677

output:

192

result:

ok 1 number(s): "192"

Test #3:

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

input:

1
1

output:

1

result:

ok 1 number(s): "1"

Test #4:

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

input:

2
22

output:

12

result:

ok 1 number(s): "12"

Test #5:

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

input:

2
21

output:

2

result:

ok 1 number(s): "2"

Test #6:

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

input:

3
233

output:

10

result:

ok 1 number(s): "10"

Test #7:

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

input:

3
666

output:

54

result:

ok 1 number(s): "54"

Test #8:

score: 0
Accepted
time: 139ms
memory: 637908kb

input:

1000000
3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333...

output:

496166704

result:

ok 1 number(s): "496166704"

Test #9:

score: -100
Memory Limit Exceeded

input:

3000000
2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222...

output:

890701718

result: