BZOJ2366 多重歷史

2021-09-07 08:48:35 字數 605 閱讀 2544

建立ac自動機,因為不存在某個串是另乙個串的字尾,因此匹配到任意位置都只可能匹配乙個串。

預處理出每個串出現的所有位置,總的出現次數為$o(m)$。

設$f[i][j]$表示考慮了前$i$個串,最後乙個串匹配位置是$j$的方案數,dp即可。

轉移則是列舉$f[i-1][k]$,$j$和$k$顯然可以雙指標維護。

時間複雜度$o(n+m)$。

#include#include#includeusing namespace std;

const int n=10010,m=500010,p=1000000;

int n,i,j,k,x,t,f[2][m],ans,len[n],tot,son[n][26],id[n],fail[n],q[n];char s[m];vectorv[n];

inline void up(int&x,int y)

void ins(int p)

}void make()else son[x][i]=son[fail[x]][i];

}int main()

for(i=0;ireturn printf("%d",ans),0;

}

bzoj4241 歷史研究

這題也是坑了好久 之前whx帶我刷joi的時候本來應該要做的。可是太懶沒有寫。區間詢問加權眾數。分塊,預處理出塊和塊之間的答案,記錄到第i個塊數字x出現了多少次。然後查詢的時候和普通眾數基本一樣,就是乘了個權值而已。要離散化。時間複雜度o nlogn mn 昨晚寫的常數太爛了。用了struct,陣列...

BZOJ4241 歷史研究

一眼覺得是莫隊,發現刪除不是很好搞,於是上回滾莫隊直接搞過 回滾莫隊用於處理難以刪除但是易於新增 其實易於刪除難以新增也可以,但是沒見過這樣題 的莫隊,排序照常,如果左右端點在同一塊直接暴力,這部分最多n sqrt n,否則把左端點在一塊的一起處理,清空莫隊,然後直接令莫隊左端點在塊尾,這部分n s...

bzoj4241 歷史研究

題目鏈結 看到題目就聯想到了 bzoj2809 apio2012 dispatching。想了想權值分塊 莫隊,發現不好維護塊內最值,又看了看80s的時間,於是怒水一發線段樹 莫隊,結果先wa後tle,不斷tle,無論怎麼改常數都不行,難道nlogn sqrt n 就是過不了嗎!不爽,蒯個題解,再見...