QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#526304 | #7876. Cyclic Substrings | mhw# | ML | 75ms | 497232kb | C++23 | 2.2kb | 2024-08-21 13:11:35 | 2024-08-21 13:11:35 |
Judging History
answer
#include<bits/stdc++.h>
#define ll long long
#define int long long
#define pii make_pair
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=b;i>=a;--i)
const ll inf = 1145141919810;
using namespace std;
inline ll read(){
ll x=0,f=1;
char c=getchar();
while (c<'0' || c>'9'){
if (c=='-') f=-1;
c=getchar();
}
while (c>='0' && c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
inline void print(ll x){
if(x < 0) putchar('-'), x = -x;
if(x > 9) print(x / 10);
putchar(x % 10 + '0');
return ;
}
inline void pprint(ll x){print(x); puts("");}
const int N = 6e6 + 7;
struct PAM {
//���ܶ൫�ǿ����˾�ը
//ʱ�临�Ӷ�O(n)
//ע��extent��������
int t[N];//cnt��ʾ���ִ���
int tot, lst = 0;
int fa[N], len[N], tr[N][15], cnt[N], pos[N];
#define sfor(x, i) for(int i = 0; i <= 14; ++i) if(tr[x][i])
PAM() {
len[1] = -1, len[0] = 0;
fa[0] = 1;
fa[1] = 1;
tot = 1, lst = 1;
}
int getfail(int x, int i) {
while(t[i - len[x] - 1] != t[i]) {
x = fa[x];
}
return x;
}
void extend(int x, int i) { //����ڵ�
t[i] = x;
int f = getfail(lst, i);//��Ҫ�����ĸ��ڵ�����
int j = tr[f][x];
if(!j) {
j = ++tot;
tr[f][x] = j;
len[j] = len[f]+2;
int tmp = getfail(fa[f], i);
if(f != 1) fa[j] = tr[tmp][x];
}
lst = j;//����lst
// cout << lst << endl;
if(!pos[lst]) pos[lst] = i;
cnt[lst]++;
}
void sum() {
for(int i = tot; i >= 0; --i) {
cnt[fa[i]] += cnt[i];
}
}
}pam1, pam2;
const ll mod = 998244353;
char s[N];
signed main() {
int n = read();
scanf("%s", s + 1);
for(int i = 1; i <= n; ++i){
pam1.extend(s[i] - '0' + 1, i);
}
for(int i = n + 1; i <= 2 * n; ++i) s[i] = s[i - n];
for(int i = 1; i <= n * 2; ++i){
pam2.extend(s[i] - '0' + 1, i);
}
ll ans1 = 0, ans2 = 0, ans = 0;
pam1.sum();
pam2.sum();
rep(i, 2, pam2.tot){
if(pam2.len[i] > n) continue;
ll cnt = pam2.cnt[i] - pam1.cnt[i];
ans = 1ll * (ans + 1ll * pam2.len[i] * cnt % mod * cnt % mod) % mod;
}
pprint(ans % mod);
}
/*
5
01010
*/
/*
8
00110011
*/
/*
3
000
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 4ms
memory: 20000kb
input:
5 01010
output:
39
result:
ok 1 number(s): "39"
Test #2:
score: 0
Accepted
time: 3ms
memory: 20224kb
input:
8 66776677
output:
192
result:
ok 1 number(s): "192"
Test #3:
score: 0
Accepted
time: 0ms
memory: 20004kb
input:
1 1
output:
1
result:
ok 1 number(s): "1"
Test #4:
score: 0
Accepted
time: 0ms
memory: 20220kb
input:
2 22
output:
12
result:
ok 1 number(s): "12"
Test #5:
score: 0
Accepted
time: 0ms
memory: 20156kb
input:
2 21
output:
2
result:
ok 1 number(s): "2"
Test #6:
score: 0
Accepted
time: 0ms
memory: 20144kb
input:
3 233
output:
10
result:
ok 1 number(s): "10"
Test #7:
score: 0
Accepted
time: 0ms
memory: 20204kb
input:
3 666
output:
54
result:
ok 1 number(s): "54"
Test #8:
score: 0
Accepted
time: 75ms
memory: 497232kb
input:
1000000 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333...
output:
496166704
result:
ok 1 number(s): "496166704"
Test #9:
score: -100
Memory Limit Exceeded
input:
3000000 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222...
output:
890701718