序列自动机(板子)

Posted zjj0624

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列自动机(板子)相关的知识,希望对你有一定的参考价值。

序列自动机
序列自动机:
n e x [ i ] [ j ] nex[i][j] nex[i][j]数组,j的范围为(0~25)即对应26个英文字母。表示原串s的第i位后面那26个字母j出现的最早的位置
也就是next指向的是下一个j的坐标,这样的话把next的值带入下一个next[i][j]中的j,就可以一直向下找。
n e x [ i ] [ j ] nex[i][j] nex[i][j]数组的初始化

int nex[N][26];
void init()
{
    memset(nex,-1,sizeof nex);
    for(int i=s.length()-1 ; i>=0 ; i--)
    {
        for(int j=0 ; j<=25 ; j++) nex[i][j]=nex[i+1][j];
        nex[i][s[i]-'a']=i;
    }
}

判断一个序列是否是初始序列的子序列

 		int now=0;
        int pos=0;
        while(pos<s1.length())
        {
            now=nex[now][s1[pos]-'a'];
            if(now!=-1) now++; //指向元素的后一个位置,这样可以一直向后找
            else break;
            pos++;
            //cout<<now<<endl;
        }
        if(pos==s1.length()) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;

以上是关于序列自动机(板子)的主要内容,如果未能解决你的问题,请参考以下文章

POJ3691DNA repair(AC自动机,DP)

树状数组板子

AC自动机总结及板子

HDU3247 Resource Archiver(AC自动机+BFS+DP)

AC自动机板子

129. 合并两个序列组合数学 / 经典板子题