QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#304355 | #7876. Cyclic Substrings | ucup-team134# | ML | 156ms | 623760kb | C++14 | 2.2kb | 2024-01-13 18:22:32 | 2024-01-13 18:22:33 |
Judging History
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;
}
Details
Tip: Click on the bar to expand more detailed information
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