为什么RA on #5
查看原帖
为什么RA on #5
1499976
Alan2024AC楼主2025/1/28 12:50

rt

code:

#include<bits/stdc++.h>

using namespace std;
const int P=205,N=2e5+5;
int len,nxt[N],jl[P][N],ans;
bool dp[N];
char ch;
string str[N],s,ss;
void getnext (int x) {
	int lenstr=str[x].size();
	nxt[0]=nxt[1]=0;
	for(int i=1,j=0;i<lenstr;i++) {
		while(j&&str[x][i]!=str[x][j]) {
			j=nxt[j];
		}
		if(str[x][i]==str[x][j]) j++;
		nxt[i+1]=j;
	}
}
void kmp () {
	int lens=s.size();
	for(int k=1;k<=len;k++) {
		int lenstr=str[k].size();
		getnext(k);
		int j=0;
		for(int i=0;i<lens;i++) {
			while(j&&s[i]!=str[k][j]) {
				j=nxt[j];
			}
			if(s[i]==str[k][j]) {
				j++;
			}
			if(j==lenstr) {
				jl[k][i-j+2]=1;
			}
		}
	}
}
int main () {
//	freopen("shell.in","r",stdin);
//	freopen("shell.out","w",stdout);
	len=1;
	while(ch=getchar()) {
		if(ch==' '||ch=='\n'||ch=='\r') {
			len++;continue;
		}
		if(ch=='.') break;
		str[len]+=ch;
	}
	while(cin>>ss) {
		s+=ss;
	}
	kmp();
	dp[0]=1;
	for(int i=1;i<=s.size();i++) {
		for(int j=1;j<=len;j++) {
			if(i-str[j].size()<0) continue;
			if(jl[j][i-str[j].size()+1]==1) {
				dp[i]=dp[i]||dp[i-str[j].size()];
			}
		}
		if(dp[i]==1) {
			ans=i;
		}
	}cout<<ans;
	return 0;
}

2025/1/28 12:50
加载中...