神犇求助
查看原帖
神犇求助
1006184
Eric_chen_153楼主2024/4/17 21:16

请大佬求助请大佬求助
T了6个点T了6个点

#include<cstdio>
using namespace std;
//O(n log n)
const int maxn=1e6+10;
int k;
char s[maxn];
int kmp[maxn];//next数组 
long long ans;
//用了比没用还慢的快读 
//inline void input(int &n){
//	char c=getchar();
//	while (c<48 || c>57) c=getchar();
//	n=c^48;
//	c=getchar();
//	while (c>47 || c<58){
//		n=(n<<3)+(n<<1)+(c^48);
//		c=getchar();
//	}
//}

int main(){
	scanf("%d",&k);
	scanf("%s",s);
	int j=0;
	for (int i=1;i<k;i++){
		while (j && (s[i]!=s[j])) j=kmp[j];
		if (s[i]==s[j]) kmp[i+1]=++j;
	}
	for (int i=1;i<=k;i++){
		j=i;
		while (kmp[j]) j=kmp[j];
		if (kmp[j]) kmp[i]=j;
		ans+=i-j;
	}
	printf("%lld",ans);
	return 0;
}

提交记录

2024/4/17 21:16
加载中...