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
*/

浙公网安备 33010602011771号