萌新刚学kmp0.114514秒,求助各路大佬orz献上关注
查看原帖
萌新刚学kmp0.114514秒,求助各路大佬orz献上关注
524801
不食嗟来之食楼主2022/10/12 11:00

rt

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=2e5+5;
char a[205][20];
char str[N];
char skk[N];
int l;
int dp[205][N],kmp[205];
int ans[N];
int le[205],j;
void Kmp(int x){
	j=0;
	memset(kmp,0,sizeof(kmp));
	for(int i=2;i<=le[x];i++){
		while(a[x][1+j]!=a[x][i]&&j){
			j=kmp[j];
		}
		if(a[x][1+j]==a[x][i]) j++;
		kmp[i]=j;
	}
	for(int i=1;i<=strlen(str+1);i++){
		while(a[x][j+1]!=str[i]&&j){
			j=kmp[j];
			
		}
		if(a[x][j+1]==str[i]) j++;
		if(j==le[x]){
			dp[x][i]=1;
			j=kmp[j];
//			printf("%d",i);
		}
	}
//	printf("\n");
	return ;
}
int main(){
	do{
		scanf("%s ",a[++l]+1);
		if(a[l][1]=='.') break;
	}while(1);
	while(cin>>skk+1){
		int l=0;
		for(int i=1;i<=strlen(skk+1);i++){
			str[++l]=skk[i];
		}
//		break;
	}
	for(int i=1;i<l;i++){
		le[i]=strlen(a[i]+1);
		Kmp(i);
	}
	ans[0]=1;
	for(int i=1;i<=strlen(str+1);i++){
		for(int j=1;j<l;j++){
			if(dp[j][i]) ans[i]=ans[i]|ans[i-le[j]];
		}
	}
	for(int i=strlen(str+1);i>=0;i--){
		if(ans[i]){
			printf("%d",i);
			return 0;
		}
	}
	return 0;
}
2022/10/12 11:00
加载中...