原创 ural1002(字典樹+dp)

題意:給你一些數字對應一些字母(一對多),然後給一個數字串和一些字母串,問數字串最少可由哪幾個字母串組成。 題解:將字母串對應的數字串插入字典樹。然後設dp[i]爲數字串第i個數字到最後一個數字最少能用幾個字母串構成,dp[i]

原创 bitset學習筆記

基本操作 對於一個叫做foo的bitset: foo.size() 返回大小(位數) foo.count() 返回1的個數 foo.any() 返回是否有1 foo.none() 返回是否沒有1 foo.set() 全都

原创 tarjan學習以及模板總結

tarjan 無向圖 割點:刪掉某點後的聯通塊增加 橋:刪掉某邊後的聯通快增加 點雙聯通圖:刪除某點後依然聯通的圖(或者沒有割點的圖) 邊雙聯通圖:刪除某邊後依然聯通的圖(或者沒有橋的圖) 雙聯通分量:點或者邊的極大雙聯通

原创 數列分塊求區間衆數(學習筆記)

數列分塊 1. 區間加法,區間求和 簡單分析一下:將數列劃分爲n−−√n 個塊,對於區間修改,整塊的進行atag標記一下,非整塊的最多隻有2n−−√2n 個,暴力加一下 複雜度:O(n−−√)O(n) #include<ios

原创 manacher(最大回文串算法+手寫模板)

poj3976 題意:求每個串的最大回文串長度。 這是一份通過manache算法理解過後手動模擬的算法,純手寫,便於理解 #include<iostream> #include<cstdio> #include<cstring

原创 hdu5296

hdu5296 題意:給定一顆邊權樹,動態地在點集中增加和刪除點。求當前所在點集中使得所有點都連通的最小邊權和。 解法: 結論: 樹上點u到以x和y爲端點的鏈的最短距離可以在O(n)預處理和O(logn)時間複雜度內求出。

原创 FFT+NTT自學筆記(大數乘積模板)

FTT學習筆記: 學習步驟 1.回顧一下複數的指數表示形式: 常規表示: z=a+ib;z=a+ib; 指數表示: z=reiθ;z=reiθ; 其中,r爲z的模,θ爲輻角主值。 z=r(cosθ+isinθ)=reiθ

原创 後綴數組學習與應用

學習步驟 首先明確幾個概念: sa[i]:即,排名爲i的後綴的起點下標 rank[i]:即,第i個後綴的排名 height[i]:即,sa[i]和sa[i-1]的最長公共前綴 h[i]:即,height[rank[i]],即

原创 Guass(高斯消元+模板)

複雜度(O(n3)O(n3) 過程:先將增廣矩陣轉上三角矩陣,然後解x[i]; 模板: #include<iostream> #include<cstdio> #include<cstring> #include<cmath>

原创 數論-素數(miller-rabin,埃式篩,歐拉篩(線性篩求歐拉函數的係數)+大數因子分解)

首先貼一個最基本的O(n−−√)n) 素數判定方法 直接進行因子檢測即可 #include<bits/stdc++.h> using namespace std; int n; bool prime(int n) { if

原创 容斥原理+快速冪求逆元+lucas

快速冪 ll qm(ll a,ll n) { ll ans=1; if(a>=mod)a%=mod;//尤其當a可能爆int時注意先加一個mod while(n) { if(n&1)

原创 數據結構與第k大

HDU2665 題意:給你一個數列長爲n,(1<=n<=100000),q次詢問,(1<=q<=100000) 題解:高級數據結構 hdu2665 + 嘗試一 數列分塊(求小於某個數的個數),再加二分得到答案。 結果(

原创 kmp簡潔模板(水題入門)

poj2406 題意:求循環節的個數 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=10000

原创 最長公共子序列、最長上升子序列、最長公共上升子序列

1.最長公共子序列: 核心代碼: for(int i=1;i<n;i++) { for(int j=1;j<m;j++) { if(a[i]==b[j])

原创 網絡流入門

貼一個網絡流詳解 gap優化之最大流(能解決幾乎所有最大流問題) 簡述一下:首先反向給節點標號,然後,正向跑,過程中用gap判斷是否有斷層,即達到優化的效果。 const int maxn = 1200; const int ma