2022CCPC Online Contest补题

E Substring Match

\(f[i][j]\) 表示 \(s\) 匹配到 \(i\)\(t\) 匹配到第 \(j\) 个大写字符的最大匹配长度。

#include<bits/stdc++.h>
#define I inline
#define int long long
using namespace std;

const int N = 100010;
string s,t;
int n,m,f[N][210];

struct H {
	int b,mod;
	int h[N],pw[N];
	
	I void init(int _b=0,int _m=0) {
		b=_b; mod=_m; pw[0]=1;
		for(int i=1;i<=100000;++i) pw[i]=pw[i-1]*b%mod;
	}
	I void ins(string x) {
		int l=x.length();
		for(int i=0;i<l;++i) {
			h[i+1]=h[i]*b+x[i]-'a'+1;
			h[i+1]%=mod;
		}
	}
	I int get(int l,int r) {
		return (h[r]-h[l-1]*pw[r-l+1]%mod+mod)%mod;
	}
}hs[2],ht[2];

I bool upper(char x) {
	return x>='A'&&x<='Z';
}
I char cg(char x) {
	return (char)(x-'A'+'a');
}
I bool same(int l1,int r1,int l2,int r2) {
	assert(r2-l2==r1-l1);
	return ht[0].get(l1,r1)==hs[0].get(l2,r2)&&ht[1].get(l1,r1)==hs[1].get(l2,r2);
}

I void solve() {
	cin>>s; n=s.length();
	cin>>t; m=t.length();
	hs[0].init(19260817,998244353);
	hs[1].init(998244353,1e9+7);
	hs[0].ins(s); hs[1].ins(s);
	
	ht[0].init(19260817,998244353);
	ht[1].init(998244353,1e9+7);
	ht[0].ins(t); ht[1].ins(t);
	
	vector<int> ps; ps.push_back(0);
	for(int i=0;i<m;++i) {
		if(upper(t[i])) {
			ps.push_back(i+1);
		}
	}
	ps.push_back(m+1);
	
	memset(f,-0x3f,sizeof(f));
	for(int i=0;i<=n;++i) f[i][0]=0;
	
	int sz=ps.size()-1;
	for(int i=0;i<=n;++i) {
		for(int j=1;j<=sz;++j) {
			int l,r,len;
			r=ps[j]-1; l=ps[j-1]+1; len=r-l+1;
			if(len<=0) {
				f[i][j]=max(f[i][j],f[i][j-1]);
			} else {
				if(i-len+1>=0&&same(l,r,i-len+1,i)) 
					f[i][j]=max(f[i][j],f[i-len][j-1]+len);				
			}		
			if(i>0&&j!=sz&&cg(t[ps[j]-1])==s[i-1]) f[i][j]=max(f[i][j],f[i-1][j]+1);	
		}
	}
	int ans=0;
	for(int i=1;i<=n;++i) {
		ans=max(ans,f[i][sz]);
	}
	cout<<ans<<endl;
}
signed main()
{
	int T; cin>>T;
	while(T--) {
		solve();
	}
}
/*
1
aaaaababababababababbabababaaaaaaaaaaaaababababbababababbbabbababab
AAAAAAAAABABABABABABabABBA

3
aaa
ABa
aaa
aAaBa
aaa
aa
*/

posted @ 2025-03-27 22:33  Kur0n1ko  阅读(16)  评论(0)    收藏  举报