nxt

POJ 1961 Period

血红的双手。 提交于 2019-12-05 20:25:39
POJ 1961 Period POJ传送门 Description For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the prefix is a periodic string. That is, for each i (2 <= i <= N) we want to know the largest K > 1 (if there is one) such that the prefix of S with length i can be written as AK ,that is A concatenated K times, for some string A. Of course, we also want to know the period K. Input The input consists of several test cases. Each test case consists of two lines. The first one contains N (2 <= N <= 1 000 000) – the size

网络最大流 复习

眉间皱痕 提交于 2019-12-04 13:38:14
哎 打板子 调了 \(2\) h 无语了 \(EdmondKarp+Dinic(Dinitz)\) #include <set> #include <stack> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define reg register int #define isdigit(x) ('0' <= x&&x <= '9') template<typename T> inline T Read(T Type) { T x = 0,f = 1; char a = getchar(); while(!isdigit(a)) {if(a == '-') f = -1;a = getchar();} while(isdigit(a)) {x = (x << 1) + (x << 3) + (a ^ '0');a = getchar();} return x * f; } const int MAXN = 10010,MAXM = 100010; int cnt,n,m,s,t,_ori[MAXN]; struct EDGE { int v,w,_nxt; EDGE() {v = w = _nxt

模板 - 数据结构 - Trie

房东的猫 提交于 2019-12-04 11:32:43
使用静态数组的nxt指针的设计,大概比使用map作为nxt指针的设计要快1倍,但空间花费大概也大1倍。在数据量小的情况下,时间和空间效率都不及map<vector ,int>。map<vector ,int>的最坏情况下效率为O(nlogn*len),而Trie的效率为O(n*len),但是实际上测出来还是map快一点,有可能在vector 实际比较的时候很快就得出大小了。 struct TrieNode { int data; int nxt[26]; void init() { data = 0; memset(nxt, 0, sizeof(nxt)); } }; struct Trie { TrieNode tn[200005]; int root, top; int newnode() { tn[++top].init(); return top; } void init() { top = 0; root = newnode(); } void insert(int *a, int len, int data) { int cur = root; for(int i = 1; i <= len; ++i) { int &nxt = tn[cur].nxt[a[i] - 'a']; if(!nxt) nxt = newnode(); cur = nxt; } tn[cur]

模板—AC自动机

筅森魡賤 提交于 2019-12-04 10:47:16
复习了一下板子。 指针实现占内存比较大,要是卡内存就恶心了…… 指针实现: struct AC { struct trie { trie *nxt[94],*fail; short inc,ct; trie(){for(int i=0;i<94;i++)nxt[i]=NULL;fail=NULL;inc=0;ct=0;} }*root=new trie(); queue<trie*>q;vector<short>al; void insert(char *s,int id) { trie *p=root;int n=strlen(s); for(int i=0;i<n;i++) { if(p->nxt[s[i]-' ']==NULL)p->nxt[s[i]-' ']=new trie(); p=p->nxt[s[i]-' ']; }p->inc=id; } void build() { q.push(root); while(!q.empty()) { trie *p=q.front();q.pop(); for(int i=0;i<94;i++) if(p->nxt[i]) p->nxt[i]->fail=(p==root?p:p->fail->nxt[i]),q.push(p->nxt[i]); else p->nxt[i]=(p==root?p:p->fail->nxt[i]

树上背包问题做题总结

狂风中的少年 提交于 2019-12-04 08:13:40
背包(一般是 \(01\) 背包吧)与树形 \(DP\) 的结合,第一维通常是节点编号,第二维通常是背包体积.由子节点向父节点转移的时候,就是一个普通的背包问题. \(T1\) :选课/ \(The\) \(more\) , \(The\) \(Better\) 洛咕 HDU(多组数据) 题意:给定一个 \(n\) 个节点的森林,带点权,选 \(m\) 个点的最大点权和,要求选子节点必须先选父节点. 分析:新建一个虚根,森林变成树.套路地,设 \(f[i][j]\) 表示以 \(i\) 点为根的子树内选择 \(j\) 个点的最大点权和.先不考虑父节点必须选的话, \(f[u][j]=max(f[u][j],f[u][j-k]+f[v][k])\) ,最后再考虑要先选父节点, \(f[u][j]=f[u][j-1]+a[u]\) . #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> #include<set> #define ll long long using namespace std; inline int read(){ int x=0,o=1;char ch=getchar();

二叉树复习

我的梦境 提交于 2019-12-03 14:39:24
其实这篇文章曾经也在 初赛复习 里。。 一个比较好的博客 满二叉树:比较简单,就是一颗满的二叉树 废话 完全二叉树:也比较简单,就是除了最后一层,上面都是满的,而最后一层的叶子结点都集中在左边。 平衡二叉树:是一颗 空树 或者对于每一个节点,他的左子树和右子树高度差不超过1, 矮矮胖胖好身材 二叉搜索(查找、排序)树,满足以下条件: 左子树上的所有节点值均小于根节点值 右子树上的所有节点值均不小于根节点值 左右子树也满足上述两个条件 对二叉树进行中序遍历时,其输出是一个有序数组 但它有一个问题,如果想要卡的话可以把这棵树卡成一条链,所以就要用到二叉平衡树。 哈夫曼树:给定N个权值作为N个叶子结点,构造一棵二叉树,使该树的带权路径长度达到最小。简单来说就是在哈夫曼编码里面,每次选 出现次数 (权值) 最小 的两个点合并,然后将每一条树枝标上0和1,该点的编码就是从根节点到这个点的路径上的0,1串 感觉说了一堆废话 还是上图现实 堆: luoguP3378 手打堆也是考的比较多的内容,要记的熟练一些,特别是一些细节。 贴一点模板: namespace Heap{ void insert(int x){ tre[++sz]=x; int nw=sz; while(nw>1){ int nxt=nw>>1; if(tre[nxt]>tre[nw])swap(tre[nxt],tre[nw]

$P1081\\ [NOIP2012]$开车旅行

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-03 13:59:45
这道题有点东西,正解调了近 \(2\) 个小时才解决, NOIP \(CSP\) 考这种题肯定 \(GG\) 了 \(Description\) 题面 题目大意是有 \(n\) 个城市,位置是 \(1-n\) ,每个城市有一定的海拔,定义每两个城市之间的距离是海拔差的绝对值, \(A、B\) 轮流开车, \(A\) 先开(话说这个好别扭,为啥非要让次近的先开),只能向右开, \(A\) 的策略是去次近的城市, \(B\) 的策略是去最近城市。最近城市判断的第一关键字是海拔差绝对值最小,若相同则海拔越低越近。 有两个问题: 第一个问题是给你开车的距离 \(x_0\) ,要求你找到一个起始点 \(s_0\) 使得到不能开位置 \(\frac{dis2}{dis1}\) 最大(若 \(dis1=0\) 则视为无穷大),输出 \(s_0\) ,不能开的位置指找不到次小值或者最小值或者距离不足。 第二个问题是给你 \(m\) 个起始位置和距离 \(s_i、x_i\) ,要求输出在给定条件下 \(A、B\) 分别行使的路程。 \(Solution\) 这道题在 \(qbxt\) 讲过,只知道是倍增也不会怎么做,于是先写暴力。 对于 \(sub1\) 的情况,需要枚举所有位置,然后再一步一步往后走,每走一步需要往后扫描找到最小值次小值,明显 \(O(n^3)\) ,发现有 \(40pts\)

OKR-Periods of Words「POI 2006」

浪子不回头ぞ 提交于 2019-12-03 11:27:26
题目描述 串是有限个小写字符的序列,特别的,一个空序列也可以是一个串。一个串 P 是串 A 的前缀,当且仅当存在串 B,使得 A = PB 。如果 P != A 并且 P 不是一个空串,那么我们说 P 是 A 的一个 proper 前缀。 定义 Q 是 A A 的周期,当且仅当 Q 是 A 的一个 proper 前缀并且 A 是 Q+Q 的前缀(不一定要是 proper 前缀)。比如串 abab 和 ababab 都是串 abababa 的周期。串 A 的最大周期就是它最长的一个周期或者是一个空串(当 A 没有周期的时候),比如说, ababab 的最大周期是 abab 。串 abc 的最大周期是空串。 给出一个串,求出它所有前缀的最大周期长度之和。 输入格式 第一行一个整数 k k,表示串的长度。 接下来一行表示给出的串。 输出格式 输出一个整数表示它所有前缀的最大周期长度之和。 样例 样例输入 8 babababa 样例输出 24 数据范围与提示 对于全部数据,1 < k < 10^6 解释一下题意: 跑一遍样例,babababa的前缀对应的最大周期长度分别是是00224466 如果你还没有看懂就只好自己yy一下了。 拿bababa来说,它的最大周期是baba不能为自己也不能为空串。 那我们很容易发现一个奇妙的性质那就是一个串的最大周期长度=len-最小前缀==后缀(非空)长度

The 2019 China Collegiate Programming Contest Harbin Site

ⅰ亾dé卋堺 提交于 2019-12-03 11:17:58
题解: https://files.cnblogs.com/files/clrs97/HarbinEditorialV2.zip Code: A. Artful Paintings /* let x=f[n] f[i-1]-f[i]<=0 i -> i-1 0 f[i]-f[i-1]<=1 i-1 -> i 1 f[l-1]-f[r]<=-k r -> l-1 -k f[r]-f[l-1]<=-k+x l-1 -> r -k+x f[n]-f[0]<=x 0 -> n x f[0]-f[n]<=-x n -> 0 -x for each cycle whose cost is A+Bx, we have A+Bx>=0 -> x>=(-A/B) so find a cycle with minimum average cost */ #include<cstdio> #include<vector> #include<algorithm> using namespace std; typedef pair<int,int>P; const int N=3010,M=3010,inf=1000000000; int Case,n,m1,m2,i,j,k,x,y,z,f[N][N],h[N],ans,nu,nd,tu,td,cnt[N<<1]; vector<P>g[N];

【刷题】【树】【模拟】树网的核

这一生的挚爱 提交于 2019-12-03 10:50:55
1>暴力出奇迹 #include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; int n,lim; const int N=303; int head[N],tot; int ev[N<<1],ew[N<<1],enx[N<<1]; void add(int u,int v,int w) { ev[++tot]=v,ew[tot]=w,enx[tot]=head[u],head[u]=tot; ev[++tot]=u,ew[tot]=w,enx[tot]=head[v],head[v]=tot; } int dis[N],fa[N];//从源点来的最短路 int pt,distant;//最远的那个点 void dfs(int rt)//两次dfs寻找任意一条直径 { bool conti=false; for(int i=head[rt];i;i=enx[i]) { if(ev[i]==fa[rt]) continue; conti=true; fa[ev[i]]=rt; dis[ev[i]]=dis[rt]+ew[i]; dfs(ev[i]); } if(!conti && distant<dis[rt] ) distant=dis[rt],pt=rt; } bool us[N];