KMP pts83 TLE#6求条
查看原帖
KMP pts83 TLE#6求条
1142472
Wsb101355楼主2025/6/15 16:23
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
string t[301],s,str;;
int lent[N],f[N],mp[N][202],cnt[N],lens;
int nxt[N];
int main(){
	int sum=0;
	while(cin>>t[++sum]&&t[sum]!="."){
		t[sum]="#"+t[sum];
		lent[sum]=t[sum].size();
	}
	
	while(cin>>str){
		s+=str;
	}
	s="#"+s;
	lens=s.size();
	
	for(int k=1;k<=sum;k++){
		//cout<<lent[k]<<endl;
		nxt[0]=-1;
		for(int i=2,j=0;i<=lent[k];i++){
			while(j&&t[k][j+1]!=t[k][i]){
				j=nxt[j];
			}
			if(t[k][j+1]==t[k][i]){
				j++;
			}
			nxt[i]=j;
		}
		for(int i=1,j=0;i<=lens;i++){
			while(j&&t[k][j+1]!=s[i]){
				j=nxt[j];
			}
			if(t[k][j+1]==s[i]){
				j++;
			}
			if(j==lent[k]-1){
				mp[i][++cnt[i]]=j;
				//cout<<k<<" "<<i<<endl;
				j=nxt[j];
			}
		}
		
	}
	int ans=0;
	f[0]=1;
	for(int i=1;i<=lens;i++ ){
		for(int j=1;j<=cnt[i];j++){
			f[i]=f[i]|f[i-mp[i][j]];
			if(f[i]){
				ans=max(ans,i);
				break;
			}
		}
	}
	cout<<ans;
	
	return 0;
}
2025/6/15 16:23
加载中...