题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=506
题意:给出两个串a和b。在a的前面或和后面删除一些后剩下的a仍然含有b(b是a的subsequence),则这种删除就是合法的。设(x,y)表示这种删法前面和后面删除的字母数。求有多少种(x,y)的组合?
思路:用f[i][j]表示从a的i位置开始字母j下一次出现的最早位置。然后,枚举a的位置i,使得a[i]=b[0],进而使用f找到a从i开始完整匹配b串的结束位置。这样,就能计算前后各能删除多少了,相乘。
string a,b;
int f[N][30];
int main()
{
RD(a); RD(b);
int i,j,k,n=SZ(a);
FOR0(i,26) f[n][i]=-1;
FORL0(i,n-1)
{
FOR0(j,26) f[i][j]=f[i+1][j];
f[i][a[i]-'a']=i;
}
int flag=1,pre=0,cur=0,x,y,L,R;
i64 ans=0;
while(cur<n)
{
while(cur<n&&a[cur]!=b[0]) cur++;
if(cur==n) break;
x=1; y=cur;
while(x<SZ(b)&&y!=-1) y=f[y+1][b[x++]-'a'];
if(x==SZ(b)&&y!=-1)
{
L=cur-pre; R=n-y-1;
if(flag) ans+=(i64)(L+1)*(R+1),flag=0;
else ans+=(i64)(R+1)*L;
pre=cur;
}
cur++;
}
PR(ans);
return 0;
}