QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#617285#7876. Cyclic SubstringsqvzeyangTL 3ms20460kbC++142.4kb2024-10-06 14:45:222024-10-06 14:45:23

Judging History

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

  • [2024-10-06 14:45:23]
  • 评测
  • 测评结果:TL
  • 用时:3ms
  • 内存:20460kb
  • [2024-10-06 14:45:22]
  • 提交

answer

#include<bits/stdc++.h>
namespace FRTMLV{
#define ll long long 
#define LD long double
#define i7 __int128
#define re return
#define con continue
using namespace std;
template<class T>inline bool ckmin(T &a,T b){re b<a?a=b,1:0;}
template<class T>inline bool ckmax(T &a,T b){re a<b?a=b,1:0;}
const int N=6e6+5;
inline int rd(){
	int d=1,k=0;char c=getchar();
	while(!(c>='0' and c<='9' or c=='-'))c=getchar();if(c=='-')d=-1,c=getchar();
	while(c>='0' and c<='9')k=(k<<3)+(k<<1)+(c^48),c=getchar();
	return d*k;
}
char stbyte;
const int mod=998244353;
int n,m,d[N<<1],cnt;
char s[N<<1],ss[N];
ll mi1[N],mi2[N],hs1[N],hs2[N];
inline ll gths1(int l,int r){re (hs1[r]-hs1[l-1]*mi1[r-l+1]%mod+mod)%mod;}
inline ll gths2(int l,int r){re (hs2[r]-hs2[l-1]*mi2[r-l+1]%mod+mod)%mod;}
unordered_map<ll,int>mp;
int f[N<<2],c[N<<2],dgr[N<<2],len[N<<2];
void manacher(char *s,int n){
	int m=0,r=0;
	for(int i=1;i<=n;i++){
		if(i<r)d[i]=min(r-i,d[(m<<1)-i]);
		while(s[i-d[i]-1]==s[i+d[i]+1])++d[i];
		if(ckmax(r,d[i]+i))m=i;
	}
}
char edbyte;
signed main(){
//	freopen("data.in","r",stdin);
//	printf("%d\n",(int)(&edbyte-&stbyte)/1048576);
	n=rd();
	scanf("%s",ss+1);
	for(int i=1;i<=n;i++)ss[i+n]=ss[i];
	for(int i=1;i<=(n<<1);i++)s[i<<1]=ss[i],s[i<<1|1]='#';
	s[0]='~',s[1]='#';
	mi1[0]=mi2[0]=1;
	for(int i=1;i<=(n<<1);i++)mi1[i]=mi1[i-1]*11%mod,mi2[i]=mi2[i-1]*13%mod;
	for(int i=1;i<=(n<<1);i++)hs1[i]=(hs1[i-1]*11+ss[i]-'0'+1)%mod,hs2[i]=(hs2[i-1]*13+ss[i]-'0'+1)%mod;
	m=(n<<1)<<1|1;
	manacher(s,m);
	for(int i=1;i<=m;i++){
		int L=d[i]>>1,p=i>>1;
		int l,r,pre=0;
		if(i&1)l=p-L+1,r=p+L;
		else l=p-L,r=p+L;
		if(i>(n<<1)){
			if(l>n)con;
			int tmp=n+1-l;
			int nl=l+tmp,nr=r-tmp;
			if(nl<=nr){
				ll hash=gths1(nl,nr)*1000000000+gths2(nl,nr);
				--c[mp[hash]];
			}
		}
		while(l<=r){
			if(r-l+1<=n){
				ll hash=gths1(l,r)*1000000000+gths2(l,r);
				int &x=mp[hash];
				if(x){
					if(!pre)c[x]++;
					else f[pre]=x,++dgr[x];
					break;
				}
				x=++cnt,len[x]=r-l+1;
				if(!pre)c[x]++;
				else f[pre]=x,++dgr[x];
				pre=x;
			}
			l++,r--;
		}
	}
	queue<int>q;
	for(int i=1;i<=cnt;i++)
		if(!dgr[i])q.push(i);
	i7 ans=0;
	while(q.size()){
		int u=q.front();q.pop();
		if(len[u]<=n)ans+=(i7)c[u]*c[u]*len[u];
		c[f[u]]+=c[u];
		if(f[u]&&!--dgr[f[u]])q.push(f[u]);
	}
	printf("%lld\n",(ll)(ans%mod));
	re 0;
}
/*
3
000

2
00

1
1

*/
}signed main(){re FRTMLV::main();}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 20168kb

input:

5
01010

output:

39

result:

ok 1 number(s): "39"

Test #2:

score: 0
Accepted
time: 0ms
memory: 20392kb

input:

8
66776677

output:

192

result:

ok 1 number(s): "192"

Test #3:

score: 0
Accepted
time: 0ms
memory: 16072kb

input:

1
1

output:

1

result:

ok 1 number(s): "1"

Test #4:

score: 0
Accepted
time: 2ms
memory: 16072kb

input:

2
22

output:

12

result:

ok 1 number(s): "12"

Test #5:

score: 0
Accepted
time: 0ms
memory: 16072kb

input:

2
21

output:

2

result:

ok 1 number(s): "2"

Test #6:

score: 0
Accepted
time: 3ms
memory: 20168kb

input:

3
233

output:

10

result:

ok 1 number(s): "10"

Test #7:

score: 0
Accepted
time: 0ms
memory: 20460kb

input:

3
666

output:

54

result:

ok 1 number(s): "54"

Test #8:

score: -100
Time Limit Exceeded

input:

1000000
3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333...

output:


result: