序列自动机(板子)
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;
以上是关于序列自动机(板子)的主要内容,如果未能解决你的问题,请参考以下文章