當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
BZOJ 4327 [JSOI2012]玄武密码 (AC自动机)
生活随笔
收集整理的這篇文章主要介紹了
BZOJ 4327 [JSOI2012]玄武密码 (AC自动机)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目鏈接: https://www.lydsy.com/JudgeOnline/problem.php?id=4327
題解:
做法挺顯然,建出AC自動(dòng)機(jī)之后在上面跑,標(biāo)記所有走過的點(diǎn),然后再進(jìn)行遞推,如果\(fail[x]\)被標(biāo)記則\(x\)被標(biāo)記,然后每一個(gè)關(guān)鍵點(diǎn)往上找即可
有一個(gè)常數(shù)優(yōu)化的技巧: 如果枚舉每個(gè)\(x\)再vis[fail[x]]|=vis[x]的話好像還需要按深度排序,不如直接每到一個(gè)點(diǎn)直接不停地跳fail一路標(biāo)記,直到遇到已標(biāo)記點(diǎn)為止
代碼
#include<cstdio> #include<cstdlib> #include<cstring> using namespace std;const int N = 1e5; const int LEN = 100; const int M = 1e7; const int SIZ = 1e7; const int S = 4; char b[N+3][LEN+3]; char a[M+3]; int len[N+3]; int son[SIZ+3][S+3]; int fail[SIZ+3]; int id[SIZ+3]; bool vis[SIZ+3]; int que[SIZ+3]; int ans[N+3]; int n,m,siz;int decode(char x) {if(x=='E') return 1;else if(x=='S') return 2;else if(x=='W') return 3;else if(x=='N') return 4; }void insertstr(int sid) {int u = 0;for(int i=1; i<=len[sid]; i++){if(son[u][b[sid][i]]==0) {siz++; son[u][b[sid][i]] = siz;}u = son[u][b[sid][i]];}id[u] = sid; }void buildACA() {int head = 1,tail = 0;for(int i=1; i<=S; i++){if(son[0][i]) {tail++; que[tail] = son[0][i];} fail[son[0][i]] = 0;}while(head<=tail){int u = que[head]; head++;for(int i=1; i<=S; i++){if(son[u][i]) {fail[son[u][i]] = son[fail[u]][i]; tail++; que[tail] = son[u][i];}else {son[u][i] = son[fail[u]][i];}}} }int main() {scanf("%d%d",&m,&n);scanf("%s",a+1); for(int i=1; i<=m; i++) a[i] = decode(a[i]);for(int i=1; i<=n; i++){scanf("%s",b[i]+1); len[i] = strlen(b[i]+1);for(int j=1; j<=len[i]; j++) b[i][j] = decode(b[i][j]);insertstr(i);}buildACA();int u = 0; vis[0] = true;for(int i=1; i<=m; i++){vis[u] = true;u = son[u][a[i]];for(int j=u; vis[j]==false; j=fail[j]) {vis[j] = true;}}for(int i=1; i<=n; i++){u = 0;for(int j=1; j<=len[i]; j++){u = son[u][b[i][j]];if(!vis[u]) {break;}ans[i]++;}}for(int i=1; i<=n; i++) printf("%d\n",ans[i]);return 0; }總結(jié)
以上是生活随笔為你收集整理的BZOJ 4327 [JSOI2012]玄武密码 (AC自动机)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ 1444 [JSOI2009]
- 下一篇: gradle idea java ssm