Time of Update: 2018-12-05
資料結構之尾碼數組1. 概述尾碼數組是一種解決字串問題的有力工具。相比於尾碼樹,它更易於實現且佔用記憶體更少。在實際應用中,尾碼數組經常用於解決字串有關的複雜問題。本文大部分內容摘自參考資料[1][2]。2. 尾碼數組2.1 幾個概念(1)尾碼數組SA 是一個一維數組,它儲存1..n 的某個排列SA[1],SA[2],……,SA[n],並且保證Suffix(SA[i]) < Suffix(SA[i+1]),1≤i<n。也就是將S 的n
Time of Update: 2018-12-05
1、概述樹狀數組(binary indexed
Time of Update: 2018-12-05
//求割點HOJ1007#include <cstdio>#define min(a,b) a>b?b:a;#define max(a,b) a>b?a:b;const int V=1001;struct Edge{ int next,to;} edge[V*V];int cnt,idx;int cut[V],n,head[V];int low[V],dfn[V];void init(){ cnt=0; idx=0; for(int i=1;
Time of Update: 2018-12-05
B-F 適用條件&範圍單源最短路徑(從源點s到其它所有頂點v); 有向圖&無向圖(無向圖可以看作(u,v),(v,u)同屬於邊集E的有向圖); 邊權可正可負(如有負權迴路輸出錯誤提示); 差分約束系統;演算法描述對每條邊進行|V|-1次Relax ( 就是鬆弛操作 )操作; 如果存在(u,v)∈E使得dis[u]+w<dis[v],則存在負權迴路;否則dis[v]即為s到v的最短距離,pre[v]為前驅。For i:=1 to |V|-1 do //v為頂點數For
Time of Update: 2018-12-05
用互斥量實現同步時如何避免死結? 當我們對一段代碼加鎖後忘瞭解鎖,我們的程式就很有可能出現死結的現象。這樣的錯誤我們一般是會小心避免的,但也絕不能保證永遠都不犯。真當出現死結而代碼量又很大的時候,問題常常很難被發現,因為多線程程式的調試常常很麻煩。 那麼有沒有辦法實現自動解鎖機制呢?當然有!我們很容易聯想到類的構造和解構函式,因為這兩者會在對象被建立和銷毀的時候被自動調用。 參考代碼:#include <pthread.h>class CMutexLock{
Time of Update: 2018-12-05
最大團 = 補圖最大獨立集 = 補圖全集 - 補圖最小路徑覆蓋 = 補圖全集 - 補圖最大匹配#define N 204int match[N];bool vis[N];int g[N][N];int n,m;bool sear(int s){ int i,j; for(i=1;i<=m;i++){//內迴圈是y集合 if(g[s][i] && !vis[i]){ vis[i] = 1;
Time of Update: 2018-12-05
**********************************************************************轉自Hao的部落格http://chhaj5236.blog.163.com/blog/static/1128810812009910102617216/**********************************************************************1.如果圖G的頂點集V(G)能分成兩個不想交的非空子集X和Y,使得
Time of Update: 2018-12-05
一般篩法:一般篩法:const int MAXN = 70000;void Prime() // 篩法求素數表p[i]=1為素數,類似於hash映射!{ int i, j; for (i=0; i<MAXN; i++) prime[i] = 1; prime[0] = prime[1] = 0; for (i=2; i<MAXN; i++) { if (!prime[i]) continue; for (j=i*2;
Time of Update: 2018-12-05
對於強連通相關概念可參考這裡推薦BYV大牛的文章O(n+m)http://www.byvoid.com/blog/scc-tarjan/**************************************************************************************************************************************************************************************
Time of Update: 2018-12-05
我發現自己的母函數忘記了不少,趁著有空就補補唄。。。母函數(Generating function)詳解 最新動向:2011.4.3
Time of Update: 2018-12-05
拓撲排序是對有向非循環圖的一種排序。表示了頂點按邊的方向出現的先後順序。如果有環,則無法表示兩個頂點的先後順序。在現實生活中,也會有不少應用例子,比如學校課程布置圖,要先修完一些基礎課,才可以繼續修專業課。一個簡單的求拓撲排序的演算法:首先要找到任意入度為0的一個頂點,刪除它及所有相鄰的邊,再找入度為0的頂點,以此類推,直到刪除所有頂點。頂點的刪除順序即為拓撲排序。 很容易得到拓撲排序的虛擬碼: void TopSort(Graph g) { for (int
Time of Update: 2018-12-05
一句話概括:最小產生樹是計算從一節點到另一節點的最小邊集;最短路是帶權路徑,計算權值最小。也就是說,最小產生樹要經過每一個點,而最短路只需要能達到某兩點,路徑權值最小即可!兩個演算法具有相當大的相似性,而且都用到了貪心思想,所以把他們放到一起。【最短路】常用的演算法有dijkstra,bellman-ford,floyd,而【最小產生樹】則是prim和kruskal。下面是各個演算法的模板。【Dijkstra複雜度O(n^2)】#include<stdio.h> //最短路
Time of Update: 2018-12-05
推薦:某cppblogwutianqi'sblog堆排序實現:#include <iostream>using namespace std; // 輸出當前堆的排序狀況void PrintArray(int data[], int size){ for (int i=1; i<=size; ++i) cout <<data[i]<<" "; cout<<endl;} // 堆化,保持堆的性質//
Time of Update: 2018-12-05
概念凸包(Convex Hull)是一個計算幾何(圖形學)中的概念。用不嚴謹的話來講,給定二維平面上的點集,凸包就是將最外層的點串連起來構成的凸多邊型,它能包含點集中所有點的。嚴謹的定義和相關概念參見維基百科:凸包。這個演算法是由數學大師葛立恒(Graham)發明的,他曾經是美國數學學會(AMS)主席、AT&T首席科學家以及國際雜技師協會(IJA)主席。(太汗了,這位大牛還會玩雜技~)問題給定平面上的二維點集,求解其凸包。過程1.
Time of Update: 2018-12-05
題意就是求[l,r]中位元與其餘元素差的絕對值再求和方法:用劃分樹求出中位元,詢問的同時求出中位元左邊元素和還有左邊元素個數,因此這裡需要增加一個數組suml[dep][i]表示深度為dep的一段區間裡劃分到左邊的元素和,求出來後就可以算出右邊元素和還有右邊元素個數,最後的結果就是ans = rs-ls+mid*(lcnt-rcnt),具體看代碼和注釋。注意有可能溢出,所以凡是跟元素和有關的變數都要long long!在這裡wa了幾次.....囧#define N 100005int a[N],
Time of Update: 2018-12-05
#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define X 120int map[X][X],dfn[X],low[X],ans[X],n,m,depth;void init(){ memset(map,0,sizeof(map)); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)
Time of Update: 2018-12-05
歐拉函數是指:對於一個正整數n,小於n且和n互質的正整數(包括1)的個數,記作φ(n) 。通式:φ(x)=x*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pn),其中p1, p2……pn為x的所有質因數,x是不為0的整數。φ(1)=1(唯一和1互質的數就是1本身)。對於質數p,φ(p) = p - 1。注意φ(1)=1.歐拉定理:對於互質的正整數a和n,有aφ(n) ≡ 1 mod n。歐拉函數是積性函數——若m,n互質,φ(mn)=φ(m)φ(n)。
Time of Update: 2018-12-05
the k-th number Xk means that we add number k at position Xk (0 <= Xk <= k-1).See hint for more details這句話要注意插數的時候是插到當前序列裡,也就是說不可能插到當前序列末尾,還有,這是可以不連續的!!!我還以為是LICS......囧#define N 100005struct node{ int l,r; int cnt;}t[N*4];void build(int
Time of Update: 2018-12-05
/*相當經典的題目了. 題的描述有點兒長, 我就不想再描述了...題中的任務A, 其本質就是求這個有向圖中所有強連通分量中, 入度為0的個數. 原理還是挺好理解的:入度不為0的強連通分量, 顯然可以由其他強連通分量達到. 也就是說, 要想讓所有學校都拿到軟體,需要且只需要從入度為0的那些強連通分量出發即可.題中的任務B稍微複雜些., 意思是增加多少條邊, 可以使整個圖變成強連通的. 這時需要分別統計入度為0和出度為0的點, 設它們的個數分別是a, b. 首先,
Time of Update: 2018-12-05
#include <cstdio>#include <string>#include <algorithm>using namespace std;const int MAX = 50005;const int LOGMAX = 15;int n, q;int st_max[LOGMAX][MAX], st_min[LOGMAX][MAX];void make_st(){ int i, j, k; for (j = 1; (1 <<