思路:
首先在b串里选,使它直接构成一个回文串,然后在A串里二分查找位置就行
c o d e code code
#include<iostream>
#include<cstdio>
using namespace std;
string s, ss;
int ans, tot, n, m;
int f[27][100000];
void dfs(int l, int r, int sl, int sr, int len)
{
// cout<<l<<' '<<r<<' '<<sl<<' '<<sr<<' '<<len<<endl;
if(len>ans)
ans=len;
if(l>r)
return;
if(sl>sr)
return;
dfs(l+1, r, sl, sr, len);
char c=ss[l];
int rr=l;
for(int i=r; i>=l; i--)
if(ss[i]==c)
{
rr=i;
break;
}
int l1=1, tr=-1, r1=f[c-'a'+1][0];
while(l1<=r1)
{
int mid=l1+r1>>1;
if(f[c-'a'+1][mid]>sr)
r1=mid-1;
else
l1=mid+1;
if(f[c-'a'+1][mid]>=sl&&f[c-'a'+1][mid]<=sr)
tr=max(tr, f[c-'a'+1][mid]);
}
if(tr==-1)
return;
int tl=10000100;
l1=1;
r1=f[c-'a'+1][0];
while(l1<=r1)
{
int mid=l1+r1>>1;
if(f[c-'a'+1][mid]<sl)
l1=mid+1;
else
r1=mid-1;
if(f[c-'a'+1][mid]>=sl&&f[c-'a'+1][mid]<=sr)
tl=min(tl, f[c-'a'+1][mid]);
}
if(tl==10000100)
return;
int t=0;
if(l==rr||tl==tr)
t=1;
else t=2;
dfs(l+1, rr-1, tl+1, tr-1, len+t);
}
int main()
{
freopen("lcps.in", "r", stdin);
freopen("lcps.out", "w", stdout);
cin>>s>>ss;
n=s.size(), m=ss.size();
for(int i=0; i<n; i++)
f[s[i]-'a'+1][++f[s[i]-'a'+1][0]]=i;
dfs(0, m-1, 0, n-1, 0);
printf("%d", ans);
return 0;
}