QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#645409 | #7876. Cyclic Substrings | black_king1 | RE | 28ms | 127436kb | C++17 | 2.4kb | 2024-10-16 18:13:49 | 2024-10-16 18:13:50 |
Judging History
answer
// Created by calabash_boy on 18-6-4.
// BZOJ 3676
// calc max(len(t)*cnt(t)) t为s回文子串,cnt(t)=t出现次数
#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e6+100;
const int mod = 998244353;
struct Palindromic_AutoMaton{
//basic
int s[maxn],now;
int nxt[maxn][10],fail[maxn],l[maxn],last,tot;
// extension
int num[maxn];/*节点代表的所有回文串出现次数*/
bool two,flag[maxn];
void clear(){
//1节点:奇数长度root 0节点:偶数长度root
s[0]=l[1]=-1;
two=false;
fail[0] = tot = now =1;
last = l[0]=0;
memset(nxt[0],0,sizeof nxt[0]);
memset(nxt[1],0,sizeof nxt[1]);
memset(flag,0,sizeof(flag));
}
Palindromic_AutoMaton(){clear();}
int newnode(int ll){
tot++;
memset(nxt[tot],0,sizeof nxt[tot]);
fail[tot]=num[tot]=0;
flag[tot]=two;
l[tot]=ll;
return tot;
}
int get_fail(int x){
while (s[now-l[x]-2]!=s[now-1])x = fail[x];
return x;
}
void add(int ch){
s[now++] = ch;
int cur = get_fail(last);
if(!nxt[cur][ch]){
int tt = newnode(l[cur]+2);
fail[tt] = nxt[get_fail(fail[cur])][ch];
nxt[cur][ch] = tt;
}
last = nxt[cur][ch];
if(flag[last]){
num[last]++;
}
}
void build(){
//fail[i]<i,拓扑更新可以单调扫描。
for (int i=tot;i>=2;i--){
num[fail[i]]+=num[i];
}
num[0]=num[1]=0;
}
void init(char* ss){
while (*ss){
add(*ss-'0');ss++;
}
}
void init(string str){
for (int i=0;i<str.size();i++){
add(str[i]-'0');
}
}
long long query(string s);
}pam;
string s;
long long Palindromic_AutoMaton::query(string s){
long long ret =0;
for (int i=2;i<=tot;i++){
if(l[i]<=s.size()){
long long temp=1ll*num[i]*num[i]%mod;
temp=1ll*temp*l[i]%mod;
ret+=temp;
ret%=mod;
//cout<<ret<<endl;
}
}
return ret;
}
int main(){
int n;scanf("%d",&n);
cin>>s;
pam.init(s);
//cout<<s<<endl;
pam.two=true;
pam.init(s);
pam.build();
printf("%lld\n",pam.query(s));
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 16232kb
input:
5 01010
output:
39
result:
ok 1 number(s): "39"
Test #2:
score: 0
Accepted
time: 3ms
memory: 16876kb
input:
8 66776677
output:
192
result:
ok 1 number(s): "192"
Test #3:
score: 0
Accepted
time: 0ms
memory: 15260kb
input:
1 1
output:
1
result:
ok 1 number(s): "1"
Test #4:
score: 0
Accepted
time: 2ms
memory: 16508kb
input:
2 22
output:
12
result:
ok 1 number(s): "12"
Test #5:
score: 0
Accepted
time: 0ms
memory: 16476kb
input:
2 21
output:
2
result:
ok 1 number(s): "2"
Test #6:
score: 0
Accepted
time: 3ms
memory: 16320kb
input:
3 233
output:
10
result:
ok 1 number(s): "10"
Test #7:
score: 0
Accepted
time: 3ms
memory: 16140kb
input:
3 666
output:
54
result:
ok 1 number(s): "54"
Test #8:
score: 0
Accepted
time: 28ms
memory: 127436kb
input:
1000000 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333...
output:
496166704
result:
ok 1 number(s): "496166704"
Test #9:
score: -100
Runtime Error
input:
3000000 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222...