我本来是准备写个ACM再开SAM的
但是QwQ这个SAM太简单了
啥?求得是前缀做不了?
是啊我们需要前缀自动机
只要你稍微有后缀自动机基础,把串直接放进自动机暴力匹配就完了
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+6e6;
struct SAM{
int n,m;
char S[N];
char ch[N];
struct Node{
int step;
int fa;
int pre;
int vis[5];
}SA[N];
int last,cnt;
inline void Insert(char C){
int p=last;
int np=++cnt;
last=np;
SA[np].step=SA[p].step+1;
for(;p&&!SA[p].vis[C-'A'];p=SA[p].pre)SA[p].vis[C-'A']=np;
if(!p)SA[np].pre=1;
else{
int q=SA[p].vis[C-'A'];
if(SA[q].step==SA[p].step+1){
SA[np].pre=q;
}
else{
int nq=++cnt;
SA[nq].step=SA[p].step+1;
memcpy(SA[nq].vis,SA[q].vis,sizeof(SA[q].vis));
SA[nq].pre=SA[q].pre;
SA[q].pre=nq;
SA[np].pre=nq;
for(;p&&SA[p].vis[C-'A']==q;p=SA[p].pre)SA[p].vis[C-'A']=nq;
}
}
}
void Solve(){
scanf("%d%d",&n,&m);
scanf("%s",S+1);
last=cnt=1;
for(int i=1;i<=n;i++){
if(S[i]=='E')S[i]='A';
if(S[i]=='S')S[i]='B';
if(S[i]=='W')S[i]='C';
if(S[i]=='N')S[i]='D';
// cout<<S[i];
Insert(S[i]);
}
for(int i=1;i<=m;i++){
scanf("%s",ch+1);
int len=strlen(ch+1);
int ans=0;
int p=1;
for(int j=1;j<=len;j++){
if(ch[j]=='E')ch[j]='A';
if(ch[j]=='S')ch[j]='B';
if(ch[j]=='W')ch[j]='C';
if(ch[j]=='N')ch[j]='D';
// cout<<ch[j]<<" ";
// cout<<j<<'\n';
if(SA[p].vis[ch[j]-'A']){
p=SA[p].vis[ch[j]-'A'];
ans++;
}else break;
// cout<<p<<'\n';
}
cout<<ans<<'\n';
}
}
}SAM;
int main(){
// freopen("4327.in","r",stdin);
SAM.Solve();
return 0;
}