#include
#include
#define ll long long int
#define max_n 1000050
#define max_tot 500050
#define met(a) memset(a,0,sizeof(a))
#define fup(i,a,n,b) for(int i=a;i#define fow(j,a,n,b) for(int j=a;j>0;j-=b)
#define mod(x) (x)%mod
using namespace std;
const
int maxn =
1e5+7;
struct ac stable[max_tot]
;int size;
//當前ac自動機節點個數
queue<
int>q;
void
init()
void
insert
(char
*s) stable[now]
.cnt++
;//結束位置++;
}void
build()
v = stable[v]
.fail;}if
(!stable[a]
.fail)stable[a]
.fail = stable[0]
.next[i]
; q.
push
(stable[u]
.next[i]);
//節點加進去}}
}}intget
(int u)
return res;
}int
match
(char
*s)if
(stable[now]
.cnt)res = res +
get(now);//
}return res;
}}ac;
char s[max_n]
;int
main
(int argc,
char
*argv)
應用:查詢母串中各單詞出現次數–對應題目p3796
/*
有 n 個由小寫字母組成的模式串以及乙個文字串 tt 。每個模式串可能會在文字串中出現多次。
你需要找出哪些模式串在文字串 t 中出現的次數最多。
輸入輸出格式
輸入格式:
輸入含多組資料。
每組資料的第一行為乙個正整數 n ,表示共有 nn 個模式串1≤n≤150 。
接下去 n 行,每行乙個長度小於等於70 的模式串。下一行是乙個長度小於等於1e6的文字串 tt 。
輸入結束標誌為 n=0 。
輸出格式:
對於每組資料,第一行輸出模式串最多出現的次數,接下去若干行每行輸出乙個出現次數最多的模式串,按輸入順序排列。
輸入輸出樣例
輸入樣例#1:
2aba
babababababac
6beta
alpha
haha
delta
dede
tata
dedeltalphahahahototatalpha
0輸出樣例#1
4aba
2alpha
haha
*/#include
#include
#define ll long long int
#define max_n 1000050
#define max_tot 500050
#define met(a) memset(a,0,sizeof(a))
#define fup(i,a,n,b) for(int i=a;i#define fow(j,a,n,b) for(int j=a;j>0;j-=b)
#define mod(x) (x)%mod
using namespace std;
const
int maxn =
1e5+7;
struct aa ans[
180]
;int
cmp(aa a, aa b)
struct ac stable[max_tot]
;int size;
//當前ac自動機節點個數
queue<
int>q;
void
init()
}void
insert
(char
*s,int n)
stable[now]
.cnt=n;
//結束位置++;
}void
build()
v = stable[v]
.fail;}if
(!stable[a]
.fail)stable[a]
.fail = stable[0]
.next[i]
; q.
push
(stable[u]
.next[i]);
//節點加進去}}
}}void
get(
int u)
return;}
intmatch
(char
*s)if
(stable[now]
.cnt)
get(now);}
return res;
}}ac;
char s[max_n]
;char s1[
200][80
];intmain
(int argc,
char
*argv)
ac.build()
;scanf
("%s"
, s)
; ac.
match
(s);
sort
(ans, ans + n+
1, cmp)
;printf
("%d\n"
, ans[0]
.cnt)
;printf
("%s\n"
, s1[ans[0]
.i])
;for
(int i =
1; i < n; i++)}
return0;
}
AC自動機模板
ac自動機模板 ac自動機模板 使用方法 1 init 初始化函式 2 insert str 插入字串函式 3 build 構建ac自動機 4 query str 返回出現的字串個數 使用需注意事項 1 注意輸入的字元的範圍,需對next和其二維大小及相關引數進行更改 2 注意next fail和e...
AC自動機模板
ac自動機主要是用於多模式串的匹配問題,按照我的理解,ac自動機就是在tire樹上實現kmp演算法,由於ac自動機加入了失敗指標,所以可以把他看成乙個狀態轉移的圖。給出模板 include include include include includeusing namespace std cons...
模板 AC自動機
我覺得ac自動機的難點和核心是構建失敗指標,父親的失敗指標的兒子 son2 中有和兒子 son1 相同的,即為son1的失敗指標 例 還是有個不懂的地方 第90行,跪求大佬賜教 include include include include include include include inclu...