SGU 506 Subsequences Of Substrings

题目链接: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;
}

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值