字典樹哇 AC自動機哇

2021-09-29 11:13:20 字數 2917 閱讀 8030

字典樹 原理:按照每個根向下發散 形成一棵 樹

這個題 需要在每乙個字母處都做統計 (求字首單詞)

開乙個 二維陣列和ant來 模擬樹 root開始為0 作為 起點 t=str[i]-『a』; 作為分支

關鍵就是 ant 這是形成樹的關鍵 ant用來區分每乙個節點 這樣二維陣列 tree才能

真正構建完成(很神奇…)

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const ll maxn=

1e6+10;

int tree[maxn][26

]; 構建父子關係

int cnt=0;

//節點區分

int root;

int sum[maxn]=;

//統計陣列

void

insert

(char s)

}int

find

(char s)

return sum[root];}

intmain()

while

(cin>>ask)

return0;

}

依舊是字典樹 按照 0/1建樹 不過是從尾部往前找 (因為2進製)

查詢時 因為 求異或最大值所以 要求二進位制對應每位應該不同

(建樹 陣列 應該開 要求的樣例*13+ 不知道怎麼求得的13+)我直接乘了32

具體解析 嵌入**中了

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const ll maxn=

1e5+7;

int a[maxn]

,b[maxn]

;int tree[maxn*32]

[2];

//構建父子關係

int cnt;

//節點區分

int root;

void

init()

void

insert

(int x)

}int

find

(int y)

return ans;

}int

main()

for(

int i=

0;i)scanf

("%d"

,&b[i]);

printf

("case #%d:\n"

,j);

for(

int i=

0;ireturn0;

}

#include

#include

#include

#include

using

namespace std;

const

int maxx=

1e6+10;

// 建樹節點個數

const

int maxn=

500005

;//建樹 大小

struct statep[maxn]

;//建樹結構體大小

int size;

//節點區分引數

void

init()

size=1;

// 首節點 復賦值

}queue<

int> q;

//構建fail佇列建立

void

insert

(char

*s) p[now]

.cnt++

;//統計 單詞 出現的次數

}void

build()

v=p[v]

.fail;

//指向自己的失敗指向 }if

(v==-1

)//為祖先

p[p[u]

.next[i]

].fail=0;

} q.

push

(p[u]

.next[i]);

//送入先的節點(子類)作為父類 構建fail }}

}}intget

(int u)

return res;

}int

match

(char

*s)if

(p[now]

.cnt)

//是都為樹分支結尾(單詞最後乙個單詞節點)

res+

=get

(now)

;//次數累加到總計

}return res;

}/*當時自己看的這段很懵逼 ****

為啥沒有乙個乙個和字串

比較 ...現在想想,笑哭 ```

1.其時有比較操作請看 for()迴圈的第乙個 if()呢就是

比較操作

2.而後來的else 是fail的跳轉 作用就是用來優化比較操作

這一點和 kmp非常相似

*/char s[maxx]

;//建立單詞陣列

intmain()

scanf

("%s"

,s);

build()

;//樹中各節點 用fail串聯 的建立

printf

("%d\n"

,match

(s));}

return0;

}

字典樹哇 AC自動機哇

字典樹 原理 按照每個根向下發散 形成一棵 樹 這個題 需要在每乙個字母處都做統計 求字首單詞 開乙個 二維陣列和ant來 模擬樹 root開始為0 作為 起點 t str i a 作為分支 關鍵就是 ant 這是形成樹的關鍵 ant用來區分每乙個節點 這樣二維陣列 tree才能 真正構建完成 很神...

AC自動機(KMP 字典樹)

ac自動機 kmp 字典樹 題目 輸入n個串,判斷有多少個搜尋串的子串 in out 1 47a ababc abcd abcde abcdef abcdefg abcd includeusing namespace std char str 1000000 100 struct node root...

字典樹問題與AC自動機

利用字串的公共字首來避免無謂的字串比較,降低查詢時間。字典樹節點 每個節點對應乙個最大可儲存字元陣列。假設字典只存26個小寫英文本母,那麼每個節點下應該有乙個長度為最大26的陣列。換言說,可存的元素型別越多,單個節點占用記憶體越大。如果用字典樹儲存漢字,那麼每個節點必須為數千個常用漢字開闢乙個陣列作...