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;

}

  

你可能感兴趣的:(substring)