原创 Relevant Phrases of Annihilation(後綴數組+二分)

#include<iostream> #include<cstdio> #include<string.h> using namespace std; const int maxn = 2000000+1000; int t1[ma

原创 poj3660(floyd求傳遞閉包)

#include<iostream> #include<cstdio> using namespace std; int n,m; const int inf = 0x3f3f3f3f; int mp[200][200]; void i

原创 poj3261(後綴數組+二分+kuangbin模版注意問題)

#include<iostream> #include<cstdio> #include<string.h> using namespace std; const int maxn = 2000000+1000; int t1[ma

原创 hdu1358(循環節)

#include<iostream> #include<cstdio> #include<string> #include<cstring> using namespace std; int knext[1000000+100]; v

原创 hdu4280(網絡流模版)

驗證了一下網絡流的板子題 發現有一個板子和kuangbin聚聚的板子效率相差不多可能還更高效 kuangbin聚聚寫的是非遞歸的 這個可能更容易敲一點 題目大意就是輸入n,m 找到s t 直接連圖求最大流 https://blog.csd

原创 Graduation Gym - 102307G (思維+拓撲排序)

這個題我看反了樹。。 優先隊列也寫反了 邏輯應該是本來優先隊列就是大根堆然後我的小於號應該按照d的大小進行重定義(不知道爲什麼一開始跑出結果來了clion害我) 就是對森林進行拓撲排序然後找擁有最大子樹的節點然後刪除 #include

原创 The Stream of Corning 2(線段樹)

#pragma GCC optimize(2) #include<iostream> #include<cstdio> #include<algorithm> using namespace std; int n,m; const i

原创 life forms poj3294(寫了很久才寫過)

後綴數組還是不熟 首先總數組的最後一個r[n]必須是0 其次設置的最大值一定要比r中最大值大 再其次 多個字符串拼接時 拼接的字符一定要不相同 最後 題目給的n上限100莫名坑爹  #include<iostream> #include

原创 P4306 [JSOI2010]連通數(tarjan+反向建圖拓撲排序)

題目大意就是給你一個有向圖 每個點的連通度就是它能到達的點的個數(包括自身) 問你所有點的連通度之和 就是tarjan縮點之後反向建圖 利用拓撲排序一層一層傳遞ans的值求解(反向建圖之後入度爲零的點肯定是沒有出度的點) 然後傳遞的時候我

原创 Distinct Substrings & New Distinct Substrings SPOJ(後綴數組統計所有不同的子串)

一個字符串所有子串的總數是n*(n+1)/2 其實要遍歷所有子串 就是找每個後綴的所有前綴 然後又因爲所有的後綴是經過後綴排序得來的 所以每個後綴與其他後綴相同的前綴最多就是Height[i] 所以n*(n+1)/2 - sum(heig

原创 洛谷P2341受歡迎的牛(強連通分量模版)

強連通分量可以看作一組點 這組點中任意兩個都是可到達的 然後把這一組點抽象成一個點即可 #include<iostream> #include<cstdio> #include<algorithm> #include<string.

原创 hdu2328(暴力kmp)

這個題我想練一下kmp就沒用後綴數組做 後綴數組的思路也很簡單 鏈接所有串 然後二分答案就可以了 也可以暴力枚舉後綴 對每一個後綴用kmp找到最小公共前綴就可以 我算着複雜度是(200*4000*400)可能3s勉強能過...但是隻用了幾

原创 洛谷P2709(簡單莫隊)

#include<iostream> #include<cstdio> #include<math.h> #include<algorithm> using namespace std; const int maxn = 50005;

原创 2019南昌邀請賽I(st+單調棧)

給出數字序列,定義一個區間內的value值是這個區間所有數之和*這個區間的最小數,求對於這個數字序列,最大的value值   肯定要使用前綴和快速的求區間所有數之和 而求取方法爲 sum[j1]-sum[j2] 我們利用單調棧找到以a[i

原创 Longest Common Substring II

給你多個串找到最長公共字串 對第一個串建樹 然後維護所有串在每一個節點處最小的匹配值 然後遍歷所有節點找到最大 需要注意的是需要從最長的後綴開始往前遍歷 如果當前節點被匹配到了 那麼它的父親節點一定也被匹配到了 而且是匹配到了父親節點的長