【KMP】border 题解

题目描述

输入

输出

样例输入

abaabaa

样例输出

17


样例解释:
f[2][a] = 1
f[3][a] = 1
f[4][a] = 1
f[4][b] = 2
f[5][a] = 1
f[5][b] = 2
f[6][a] = 3
f[7][a] = 4
f[7][b] = 2
以上为>0的f[][],求和=17

数据范围限制

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long
using namespace std;
ll nxt[1000010],n,ans,f[1000010][26];
char s[1000010];
void getNext(){
	for(ll i=1,j=0;i<n;i++){
		while(j>0 && s[i]!=s[j]) j=nxt[j-1];
		if(s[i]==s[j]){
			j++;
		}
		nxt[i]=j;
	}
}
int main(){
	scanf("%s",s);
	n=strlen(s);
	getNext();
	for(ll x=1;x<n;x++){
		for(char c='a';c<='z';c++){
			if(c==s[nxt[x-1]]){
				f[x][c-'a']=nxt[x-1]+1;
			}
			else{
				f[x][c-'a']=f[nxt[x-1]][c-'a'];
			}
			ans+=f[x][c-'a'];
		}
	}
	printf("%lld",ans);
} 
posted @ 2023-08-13 09:51  ZnPdCo  阅读(27)  评论(0编辑  收藏  举报