學習筆記 二進位制分組

2022-04-29 23:15:08 字數 1893 閱讀 7580

ac自動機+二進位制分組。

利用二進位制分組思想,維護乙個 \(siz\) 從大到小的單調棧,若 \(siz_=siz_\) 就一直暴力合併兩個 \(ac\) 自動機並求出新 \(ac\) 自動機的 \(fail\) 指標。

\(code\ below:\)

#include using namespace std;

const int maxn=300000+10;

int n;char s[maxn];

struct aho_corasick_automaton

num[x]+=num[y];

for(int i=0;i<26;i++) merge(ch[x][i],ch[y][i]);

} void getfail(int p)

else vis[p][c]=p;

} while(!q.empty())

else vis[p][c]=vis[fail[p]][c];

}sum[p]=num[p]+sum[fail[p]];

} }void insert(char *s)

num[p]=1;

while(siz[top-1]==siz[top])

getfail(rt[top]);

} int query(char *s)

} return ans;

}}a,b;

int main()

return 0;

}

離線做法:\(cdq\) 分治。

暴力合併兩棵主席樹,別忘弄乙個**空間的垃圾桶 \(rub\)

然後我兩點多的時候第一次提交 \(re\),本地測起來 \(mle\),調了乙個多小時,最後發現垃圾桶寫錯了。。。

\(code\ below:\)

#include #define pii pair#define mp make_pair

using namespace std;

const int maxn=200000+10;

const int lim=100000;

const int inf=0x3f3f3f3f;

int n,q,a[maxn],rt[20][maxn],siz[20],top;

int l[maxn<<5],r[maxn<<5],sum[maxn<<5],rub[maxn<<5],tot,cnt;

vectorv[20];bool vis[maxn<<5];

inline void read(int &x)

while(isdigit(ch))

if(f==-1) x=-x;

}inline void print(int x)

if(x==0) putchar('0');

static int sta[40],top=0;

while(x) sta[++top]=x%10,x/=10;

while(top) putchar(sta[top--]+'0');

putchar('\n');

}int newnode()

void update(int &now,int pre,int l,int r,int x)

int query(int u,int v,int le,int ri,int l,int r)

void del(int x)

void build(int x)

}void insert(int x,int y)

siz[top-1]+=siz[top];build(--top);

}}int ask(int x,int y,int k)

return ans;

}int main()

return 0;

}

二進位制分組擴充套件

最近才發現的乙個套路,以前以為二進位制分組只能搞揹包,結果發現還有一些更為優秀的操作。我們對於乙個不支援動態操作的資料結構,拆分為 log 個,然後每次加入元素加入到乙個新的組中,如果最新的兩個資料結構元素個數相等,就合併兩個元素。然後暴力重構這個合併得到的資料結構。然後查詢的時候就查詢每乙個分組內...

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

二進位制列舉 學習筆記

紫書215頁暴力求解法裡面有一道題目 cutting chains uva 818 要用到二進位制列舉,所以學了一下 總結來說就是對n個事件 n 32 每個事件都有兩種情況,所以可以用0和1來表示事件的發生和不發生,每個事件的序號又可以和二進位制位相對應,所以全部n事件的狀態,可以用1到2 n的數字...