模板题,字典树最基本的操作
在看别人的板子的时候学到了一点小技巧
下面贴AC代码,顺便补一补字典树相关
字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽
#include<bits/stdc++.h> using namespace std; const int MAX = 5e4 + 5; string s; int n, t, ans; struct Trie { Trie *next[2]; int vis; Trie() //这个方法开节点很方便的,码一下 { for (int i = 0; i<2; i++) this->next[i] = NULL; this->vis = 0; } }; void insertrie(Trie* rt, string s) { int len = s.length(); Trie *p = rt; for (int i = 0; i<len; i++) { int id = s[i] - '0'; if (p->next[id] == NULL) { p->next[id] = new Trie; } p = p->next[id]; p->vis++; ans = max(ans, (i+1)*p->vis); } } int main() { cin >> t; while (t--) { cin >> n; ans = 0; Trie *rt=new Trie; for (int i = 0; i<n; i++) { cin >> s; insertrie(rt, s); } cout << ans << endl; } return 0; }
小笔记♪(^∇^*)
背景+定义:字典树进行推广实际上是一个N叉树,字典树相对比较简单,但重要的是在此基础上的AC自动机比较难。字典树的功能实际上是对于很多的串进行压缩。
板子:
#include<bits/stdc++.h> using namespace std; const int ALTN=26; string s; int n; struct Node{ Node *nxt[ALTN]; int flag; Node() { for(int i=0;i<ALTN;i++) nxt[i]=NULL; flag=0; //flag的相关应用是难点的感觉? } }; Node *rt; void init() { rt=new Node(); } void insertrie(string s) { int len=s.length(); Node *p=rt; for(int i=0;i<len;i++) { int id=s[i]-'a'; if(p->nxt[id]==NULL) p->nxt[id]=new Node(); p=p->nxt[id]; } p->flag++; } int findtrie(string s) //查找字符串个数 { int len =s.length(); Node *p=rt; for(int i=0;i<len;i++) { int id= s[i]-'a'; if(p->nxt[id]==NULL) return 0; p=p->nxt[id]; } return p->flag; } int dealtrie(Node *p) { int i; if(p==NULL) return 0; for(int i=0;i<ALTN;i++) { if(p->nxt[i]!==NULL) dealtrie(p->nxt[i]); } free(p); return 0; }