AC自動機的基本操作

2021-08-26 05:30:27 字數 2953 閱讀 6485

1.詢問在文字串中各個詢問串各出現了幾次

hdu3065

#include

#include

#include

#include

#include

#include

#include

#define liangjiajun main

using

namespace

std;

int t;

int n,sz,ch[500004][34],p[500004],cnt[500004];

char s[1004][54],m[2000004];

int ans[1004];

queue

q;int ins(char *s,int num)

}cnt[now]=num;

return0;}

int build()

}return0;}

int solve(char *pro)

int to=pro[i]-'a';

while(!ch[now][to])now=p[now];

now=ch[now][to];

for(int j=now;j;j=p[j])

}return0;}

int w33ha()

memset(ans,0,sizeof(ans));

sz=1;

for(int i=0;i<26;i++)ch[0][i]=1;

for(int i=1;i<=n;i++)

scanf("%s",m+1);

build();

solve(m);

for(int i=1;i<=n;i++)

}return0;}

int liangjiajun()

2.詢問在文字串中有幾個詢問串出現過

hdu2222

#include

#include

#include

#include

#include

#include

#include

#define liangjiajun main

using

namespace

std;

int n,sz,ans,ch[1000004][34],p[1000004],cnt[1000004];

char s[54],m[1000004];

bool mark[1000004];

queue

q;int ins(char *s)

}cnt[now]++;

return0;}

int build()

}return0;}

int solve(char *pro)}}

return ret;

}int w33ha()

scanf("%d",&n);

sz=1;ans=0;

for(int i=0;i<26;i++)ch[0][i]=1;

for(int i=1;i<=n;i++)

scanf("%s",m+1);

build();

printf("%d\n",solve(m));

return0;}

int liangjiajun()

3.詢問在文字串中,各個詢問串出現了幾次,如果不算公共區間的話,各個詢問串出現了幾次

zoj3228

#include

#include

#include

#include

#include

#include

#include

#include

#define liangjiajun main

using

namespace

std;

int t;

int n,sz,ch[600004][27],p[600004],cnt[600004];

char m[100004];

vector

vec[100004];

struct aska[100004];

inline

bool dex(ask a,ask b)

}return1;}

int ans[100004][4],ret[100004];

queue

q;int ins(char *s,int num)

}cnt[now]=num;

return0;}

int build()

}return0;}

int solve(char *pro)

}for(int i=1;i<=n;i++)

}vec[i].clear();}}

return0;}

int w33ha(int case)

memset(ans,0,sizeof(ans));

memset(ret,0,sizeof(ret));

sz=1;

for(int i=0;i<26;i++)ch[0][i]=1;

scanf("%d",&n);

for(int i=1;i<=n;i++)

sort(a+1,a+n+1,dex);

ins(a[1].s,1);

for(int i=2;i<=n;i++)

build();

solve(m);

for(int i=2;i<=n;i++)

}for(int i=1;i<=n;i++)

printf("case %d\n",case);

for(int i=1;i<=n;i++)

puts("");

return0;}

int liangjiajun()

AC自動機 建立nlogn個AC自動機

string set queries 題意 給你3種操作,1 加入乙個串到集合中。2 刪除集合中的某乙個串 3 查詢集合中的字串在給定的字串種出現幾次。同乙個串可重複 解法 建立多個ac自動機,用二進位制分組來處理。加入給你21個串 分為 16 4 1,再新增乙個串的時候,即21 1,22 16 4...

AC自動機及字尾自動機

ac自動機是一種基於trie樹的演算法,其本質和kmp上的處理很相似。trie樹結構 kmp轉移思路 ac自動機組要由三個部分組成 trie樹的建立 fail指標的匹配 對ac自動機的詢問 每次建立自動機會有一次初始化 ac自動機類 struct node node結構體 struct ac voi...

AC自動機演算法

ac自動機簡介 首先簡要介紹一下ac自動機 aho corasickautomation,該演算法在1975年產生於貝爾實驗室,是著名的多模匹配演算法之一。乙個常見的例子就是給出n個單詞,再給出一段包含m個字元的文章,讓你找出有多少個單詞在文章裡出現過。要搞懂ac自動機,先得有字典樹trie和kmp...