小集訓之旅 一

2022-03-18 06:46:19 字數 1440 閱讀 4839

有多大的思想,才有多大的能量。

學習內容:aho-corasick automaton(ac自動機)

(原來不是自動ac機…)

演算法用途:多模板串的模式匹配問題。

演算法步驟:

用模板串構造trie樹(字典樹 or 字首樹);

用bfs在trie樹中構建失配指標fail;

模式匹配(文字串和模板串進行匹配)

hdu2222 keywords search(本題即為模版…)

題乙個裸題(入門練手用

)(但要注意細節,不然要像我一樣調兩三節課,555)

#include#include#include#include#include#define n 500010 

using namespace std;

int trie[n][27],f[n],last[n],val[n],n,cnt,ans;

char t[2*n],p[55];

void make(int x) //求答案,與劉汝佳的print()相似

void add_trie(char *p) //模板串加入trie樹

val[x]++; //有重複模板串

}void getfail() //bfs求fail(and last)

}}void aho_corasick_automaton(char *t) //匹配

}int main()

return 0;

}/* 對於多組資料 :

trie,val 必須memset

f,last 不必memset,

因為(在bfs求fail值時)每個點的f和last值**於之前的點

所以只需在往佇列裡加初值時,把對應的點的f和last賦值為0就行了 */

如汝佳所言

(《訓練指南》p216)

:「把所有不存在的邊補上,即把計算失配函式中的語句 if(!u)continue; 改為 if(!u);這樣while()便可直接刪去。」

(個人認為原理同求last是一致的,與bfs的先進先出的特點有關)

改後的**如下: 

void getfail()                              

; //**

q.push(u);v=f[rt];

f[u]=trie[v][i];

last[u]=val[f[u]]?f[u]:last[f[u]];}}

}void aho_corasick_automaton(char *t)

}

linux命令小集結一

ps ef grep sshd 檢視ssh服務是否啟動 pid kill 9 pid 絕殺 service sshd start 啟動ssh服務 service sshd restart 重啟ssh服務 service sshd stop 停止ssh服務 ifconfig 檢視網絡卡ip 啟用狀態下...

爬蟲之旅(一)

usr bin python encoding utf 8 author administrator import selenium import sys import urllib import requests import re if name main import os from sele...

高階之旅 一

前言 工具 androidstudio 夜神android模擬器 先介紹rect與rectf,下面會用到 相同點都是用於表示座標系中的一塊矩形區域,並可以對其做一些簡單操作。這塊矩形區域,需要用左上和右下兩個座標點表示。區別就是精度不一樣。rect是使用int型別作為數值,rectf是使用float...