原创 字符串的最大最小表示法

算法描述:給定一個字符串s,可以進行左循環(右循環)移位,總共的結果有strlen(s)種,在這些結果中最小的是那個,最大的是哪個。 詳解描述 論文傳送門 HDU3374 題目意思:給定一個字符串s求循環幾次會是字典序最小

原创 伸展樹(Splay)

codevs 4655序列終結者 Splay樹是一個優化過的二叉搜索樹,所以它滿足二叉搜索樹的性質,二叉搜索樹有可能退化爲一條鏈,n^2的時間複雜度,而Splay經過一系列的旋轉操作使其平均複雜度控制在log(2)n但是常數比較

原创 kmp

/* kmp的next數組存的是i之前的串的前綴和後綴的最長匹配長度 */ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> usi

原创 hdu 2243 AC自動機+dp(矩陣快速冪優化)

做這個之前建議做一下poj 2778 這道題要求長度小於等於m的字符串包含所給串的有多少種,可以算出所有的情況然後減去不包含所給串的情況就是所求的。 大佬博客 大佬博客 矩陣裏面存的是從i節點到j節點走一步共有多少種走法(

原创 取模最短路

hdu 6071 題意:圖上有4個點,給定一個k求從2點出發最後回到2這個點且距離不小於k的最短距離。 思路:題目上說的從2出發最後又回到2,所以這是一個迴路,而兩個迴路可以形成一個新的迴路,假如現在有兩個迴路,長度分別爲a和

原创 靜態主席樹

POJ - 2104 主席樹和值域線段樹存的值都是一樣的,但是主席樹是n棵線段樹,第i棵線段樹存儲的是i和i之前的所有信息(和前綴和類似),所以在求有關區間L~R的時候就可以用第R棵線段樹減去第L-1棵線段樹對應節點的值就得到了

原创 各種數論定理

小技巧 當算某個數的階乘或者算很大的次方的時候,可以將數字轉換爲10^n的進製表示方法(比如1000進制或者10000進制),這樣出來點的數字和原答案是一樣的,只不過在一個數組的一個元素中多存了幾位。 約數個數定理 首先,n可

原创 莫比烏斯反演

大佬博客 hdu 1695 題意:讓求從a~b區間和c~d區間有多少對的數的gcd爲k,不能有重複的,gcd(2,3)和gcd(3,2)算重複的。 莫比烏斯函數應用的經典題,先求出所有的值然後再減去重複區間的值就好了。 假設

原创 計數dp

1265: Hmz 的女裝 思路:當起始點顏色固定後,我們可以依次求出其往後的每個點的塗色方式,包含和起始點顏色相同還有和起始點顏色不同,而當前點的狀態可以由上一個點的狀態推出來,最後選擇和起始點不同的方式數就好了(起點終點顏色

原创 反素數

反素數定義 大佬博客 題目鏈接 給定一個n求因子個數爲n的最小的值是多少。 #include <cmath> #include <cstdio> #include <cstring> #include <iostream>

原创 動態主席樹

ZOJ 2112 題目大意:給n個數,有m個操作。修改某個數,或者詢問一段區間的第k小值。 動態主席樹的意思就是原來的數組已經建好主席樹了,然後又要修改數組中的某個值,然後還有許多查詢,當然不止一次修改。 如果我們每次都建立

原创 值域線段樹

題目鏈接 題目可轉化爲值域線段樹的寫法,題目上說讓求所有區間和的值在L到R之間的有多少個,每一個區間值可以由數組的前綴和快速求出來,設sum[i]爲i之前的和,i小於j即求sum[j]-sum[i]在L到R之間的有多少個,可以轉

原创 Manacher算法--O(n)迴文子串算法

馬拉車算法詳解地址 #include<cstring> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int p[2000

原创 Treap

POJ - 3481 警告:千萬不要初始化種子,這oj會RE被坑了一天QAQ。 Treap就是一個用隨機數優化了的二叉搜索樹,二叉搜索樹滿足某個節點的值大於等於左兒子節點的值,小於右兒子節點的值,但是這樣插入的值就會有可能形成

原创 lucas定理

題目鏈接 大佬博客還有擴展lucas 題意:給你n和m求C(n,m)。 C(n,m)=n!/(m!*(n-m)!); 當題目數據不是很大的時候可以打表,存一個階乘表和逆元表,這樣就可以直接計算了,但是當n和m很大的時候,就