序列自动机(模板)

例题:P1819 公共子序列

文章

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=160;
const ll mod=1e8;
char a[N],b[N],c[N];
int nxta[N][30],nxtb[N][30],nxtc[N][30],n;
ll f[N][N][N];
void make_nxt(int nxt[][30],int len,char a[])//构造nxt数组 
{
    for(int i=len-1;i>=0;i--)
    {
        for(int j=0;j<=25;j++)   nxt[i][j]=nxt[i+1][j];
        nxt[i][a[i+1]-'a']=i+1;//一次只会更新a[i+1]-'a'的值 
    }
}
ll dfs(int x,int y,int z)
{
    if(f[x][y][z])  return f[x][y][z];
    for(int i=0;i<=25;i++)
    {
        int q=nxta[x][i],w=nxtb[y][i],e=nxtc[z][i];
        if(q&&w&&e)//都能延续下去
            f[x][y][z] = ( f[x][y][z]+dfs(q,w,e) ) % mod;
    //这里怎么理解呢?要知道dfs是到最底下一层一层返回上来
    //以q,w,e开头的子串可以接在x,y,z上,所以加上去 
    }
    if(x||y||z) f[x][y][z]=(f[x][y][z]+1)%mod;// 
    return f[x][y][z];
}
int main()
{
    cin>>n;
    scanf("%s%s%s",a+1,b+1,c+1);
    int la=strlen(a+1),lb=strlen(b+1),lc=strlen(c+1);
    make_nxt(nxta,la,a);
    make_nxt(nxtb,lb,b);
    make_nxt(nxtc,lc,c);
    cout<<dfs(0,0,0)%mod;
}

原文链接: https://www.cnblogs.com/iss-ue/p/12762384.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    序列自动机(模板)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/344044

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午2:26
下一篇 2023年3月2日 上午2:26

相关推荐