思路:
需要维护一个栈的AC自动机……. 要求出来 最后的栈顶是在自动机上的哪个节点。if(!ac.ch[st[tp-1]][a[i]-'a']) st[tp]=ac.ch[ac.f[st[tp-1]]][a[i]-'a'];else st[tp]=ac.ch[st[tp-1]][a[i]-'a'];
如果ch[][] 到不了根 就要走到fail
//By SiriusRen#include#include #include #include using namespace std;#define N 500050#define M 26int n,st[100050],tp=0;char a[100050],jy[100500];struct AC_Automata{ int sz,ch[N][M],f[N],len[N]; void insert(char s[],int num){ int u=0,i; for(i=0;s[i];i++){ if(!ch[u][s[i]-'a'])ch[u][s[i]-'a']=++sz; u=ch[u][s[i]-'a']; } len[u]=i; } void build(){ f[0]=500000; queue q;q.push(0); while(!q.empty()){ int r=q.front();q.pop(); for(int i=0;i