Noip前的大抱佛腳----字符串
阿新 • • 發佈:2018-11-04
har 組合 while class code earch str emp ems ,查詢是否有在這個範圍之內的x即可
字符串
知識點
AC自動機
把多個串插入一個自動機裏進行匹配,其實建好的是Trie圖
void Add(char *s,int op) { int x=0,len=strlen(s+1); for(int i=1;i<=len;i++) { int &v=ch[x][s[i]-'a']; if(!v) v=++node;x=v; } tag[x]+=op; } void Get_Trie() { for(int i=0;i<=1;i++) if(ch[0][i]) Q.push(ch[0][i]); while(!Q.empty()) { int x=Q.front();Q.pop(); for(int i=0;i<=1;i++) if(!ch[x][i]) ch[x][i]=ch[fail[x]][i]; else fail[ch[x][i]]=ch[fail[x]][i],Q.push(ch[x][i]); } }
套路
用FFT求解字符串匹配問題
- 一一對應
把其中一個\(Reverse\)後,對於每個字符跑一遍FFT,打上\(Tag\)
如果在某個位置上有串長個\(Tag\)那便是匹配上了一處
- 模糊匹配
\(Fuzzy Search\) 在跑\(FFT\)前把模糊門限值的區間內全部置為1,然後同樣的操作
兩(多)串DP時狀態合並
插入AC自動機,老套路了
Trie樹上貪心
通常求解一堆數和A進行異或、與等操作的最大值,直接貪心即可
但是求(x+B)^A的最大值呢(SCOI2016美味)(當然&操作也是一樣的,這種題通常值域很小)
同樣貪心地做
開值域線段樹,貪心到某一位,需要該位為0或者1,則對應地可以算出x的範圍
掛鏈哈希
期望\(O(1)\),當然支持查詢多個關鍵字
const int Mo=YYB; struct HashTable { struct Line{int next,val;}a[Mo]; int head[Mo],cnt; void reset() {memset(head,0,sizeof(head));cnt=0;} void Add(int p,int val) {a[++cnt]=(Line){head[p],val};head[p]=cnt;} int Query(int x) { for(int i=head[x%Mo];i;i=a[i].next) if(a[i].val==x) return 1;return 0; } }Hash;
哈希處理回文串
正反哈希前綴和即可求出區間哈希值,然後查詢起點到回文中心的正哈希和回文中心到終點的反哈希即可
樹哈希
例:一棵無根樹的本質不同的獨立集個數(\(k\)棵相同子樹方案為\(x\)則乘一個可重組合)
Noip前的大抱佛腳----字符串