求救
查看原帖
求救
809708
whssy楼主2023/7/28 22:51
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
using namespace std;
const int N=2e5+5;
int id=1;
char p[202][12];
char str[N];
int nxt[202][12];
bool dp[N],vis[202][N];
void init(){
	while(scanf("%s",p[id]+1),p[id][1]!='.')
		id++;
	id--;id--;
	int len=0;
	string s,temp;
	while(cin>>temp)
		s+=temp;
	strcpy(str+1,s.c_str());
	return;
}
void KMP(int k){
	int len1=strlen(str+1),len2=strlen(p[k]+1);
	for(int i=2,j=0;i<=len2;i++){
		while(j>0&&p[k][i]!=p[k][j+1])
			j=nxt[k][j];
		if(p[k][i]==p[k][j+1]) j++;
		nxt[k][i]=j;
	}
	for(int i=1,j=0;i<=len1;i++){
		while(j>0&&str[i]!=p[k][j+1])
			j=nxt[k][j];
		if(str[i]==p[k][j+1]) j++;
		if(j==len2){
			vis[k][i]=true;//p[k]末尾与str[i]相同 
			j=nxt[k][j];
		}
	}
}
int main(){
	init();
	for(int i=1;i<=id;i++)
		KMP(i);
	int len=strlen(str+1);
	dp[0]=true;
	for(int i=1;i<=len;i++)
		for(int j=1;j<=id;j++)
			if(vis[j][i]) dp[i]=dp[i]||dp[i-strlen(p[j]+1)];
	for(int i=len;i>=0;i--)
		if(dp[i]){
			printf("%d",i);
			break;
		}
	cout<<str+1;
	return 0;
}
2023/7/28 22:51
加载中...