原创 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