洛谷P1470 最长前缀 Longest Prefix】的更多相关文章

P1470 最长前缀 Longest Prefix 73通过 236提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 求大神指导,为何错? 题目描述 在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的.生物学家对于把长的序列分解成较短的序列(即元素)很感兴趣. 如果一个集合 P 中的元素可以通过串联(元素可以重复使用,相当于 Pascal 中的 "+" 运算符)组成一个序列 S ,那么我们认为序列 S 可以分解为 P 中的元素.…
题目传送门 解题思路: 其实思路没那么难,就是题面不好理解,解释一下题面吧. 就是在下面的字符串中找一个子串,使其以某种方式被分解后,每部分都是上面所给集合中的元素. AC代码: #include<iostream> #include<cstdio> #include<cstring> #include<set> using namespace std; ]; string l,k,p; ]; ,m; inline int max(int s,int d)…
P1470 最长前缀 Longest Prefix 题目描述 在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的.生物学家对于把长的序列分解成较短的序列(即元素)很感兴趣. 如果一个集合 P 中的元素可以通过串联(元素可以重复使用,相当于 Pascal 中的 “+” 运算符)组成一个序列 S ,那么我们认为序列 S 可以分解为 P 中的元素.元素不一定要全部出现(如下例中BBC就没有出现).举个例子,序列 ABABACABAAB 可以分解为下面集合中的元素: {A, AB, BA,…
题目描述 在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的.生物学家对于把长的序列分解成较短的序列(即元素)很感兴趣. 如果一个集合 P 中的元素可以通过串联(元素可以重复使用,相当于 Pascal 中的 “+” 运算符)组成一个序列 S ,那么我们认为序列 S 可以分解为 P 中的元素.元素不一定要全部出现(如下例中BBC就没有出现).举个例子,序列 ABABACABAAB 可以分解为下面集合中的元素: {A, AB, BA, CA, BBC} 序列 S 的前面 K 个字符称作…
P1807 最长路_NOI导刊2010提高(07) 题目描述 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j.设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径. 输入格式 输入文件longest.in的第一行有两个整数n和m,表示有n个顶点和m条边,接下来m行中每行输入3个整数a,b,v(表示从a点到b点有条边,边的长度为v). 输出格式 输出文件longest.out,一个整数,即1到n之间的最长路径.如果1到n之间没连通…
题目描述 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j.设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径. 输入格式 输入文件longest.in的第一行有两个整数n和m,表示有n个顶点和m条边,接下来m行中每行输入3个整数a,b,v(表示从a点到b点有条边,边的长度为v). 输出格式 输出文件longest.out,一个整数,即1到n之间的最长路径.如果1到n之间没连通,输出-1. 输入输出样例 输入 #1复制 2 1…
可以发现只有当两个序列中都没有重复元素时(1-n的排列)此种优化才是高效的,不然可能很不稳定. 求a[] 与b[]中的LCS 通过记录lis[i]表示a[i]在b[]中的位置,将LCS问题转化为最长上升子序列问题,转化方法如下: for(int i=1;i<=n;i++){ local[b[i]]=i; } for(int i=1;i<=n;i++){ lis[i]=local[a[i]]; } 当序列中有元素重复时,我们们需要保证对于每个a[i]所记录的位置必须是逆序的,以保证一个元素只取一…
题目链接 \(Description\) 给定一个长为n的序列,每次可以反转 \([l,r]\) 区间,代价为 \(r-l+1\).要求在\(4*10^6\)代价内使其LIS长度最长,并输出需要操作的数量及每个反转操作. \(n\leq32000\). \(Solution\) 显然,需要在4e6的代价内将\(1\sim n\)尽可能排好序.(而且不一定要反转一大段区间,可以交换相邻元素实现一个元素的移动) Subtask2 \(n\leq1000\) 可以用冒泡排序将每个元素放到应放的位置上,…
https://www.luogu.org/problemnew/show/P2766 注:题目描述有误,本题求的是最长不下降子序列 方案无限多时输出 n 网络流求方案数,长见识了 第一问: DP 同时得到f[i] 表示 以第i个数为开头的最长不下降子序列长度 第二问: 每个点拆出2个点 i<<1,i<<1|1,之间连流量为1的边 如果f[i]==最长长度,源点向i<<1连流量为1的边 如果f[i]==1,i<<1|1向汇点连流量为1的边 如果 i<j…
传送门 其实和最长k可重区间集问题差不多诶…… 把这条开线段给压成x轴上的一条线段,然后按上面说的那种方法做即可 然而有一个坑点是线段可以垂直于x轴,然后一压变成一个点,连上正权环,求最长路……然后spfa他就死了…… 怎么解决呢……把每一个区间的左右端点坐标扩大两倍,如果相等就$--l[i]$,否则$++l[i]$,这样的话能保证本来不能覆盖的点仍不能覆盖,本来可以覆盖的点仍可以覆盖 似乎讲不清楚……感性理解一下好了…… //minamoto #include<iostream> #incl…
传送门 第一问直接$dp$解决,求出$len$ 然后用$f[i]$表示以$i$为结尾的最长不下降子序列长度,把每一个点拆成$A_i,B_i$两个点,然后从$A_i$向$B_i$连容量为$1$的边 然后考虑$f[i]$,如果$f[i]==1$,则从$s$向$A_i$连边,如果$f[i]==len$,那么从$B_i$向$t$连边 然后将每一个$j<i,f[j]+1==f[i],a[j]\leq a[i]$的$j$向$i$连边 以上容量全为$1$ 建完图之后跑一个最大流 这样可以保证分层图里选出来的不…
题目大意:输入$n$个正整数,($1\leq n\leq 10000$),要求输出最长的连号的长度.(连号指从小到大连续自然数) 题解:考虑从小到大连续自然数差分为$1$,所以可以把原数列差分(后缀自动机不怎么会写啊),查询串为$1,11,111,\dots,111\dots(n-1个1)$,把它们插入到$AC$自动机中,然后查询即可,原数列差分不为$0,1$时赋为$0$(因为不对答案有影响) 卡点:1.原序列差分的数不为$0,1$时会挂... C++ Code:($AC$自动机2018-8-1…
题目描述 给定一棵 nn 个点的带权树,结点下标从 11 开始到 NN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有节点权值的异或. 输入输出格式 输入格式: 第一行一个整数 NN ,表示点数. 接下来 n-1n−1 行,给出 u,v,wu,v,w ,分别表示树上的 uu 点和 vv 点有连边,边的权值是 ww . 输出格式: 一行,一个整数表示答案. 输入输出样例 输入样例#1: 4 1 2 3 2 3 4 2 4 6 输出样例#1: 7 说明 最长异…
最长路 #include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <vector> using namespace std; //Mystery_Sky // #define maxn 1000010 #define maxm 5000050 #define INF 0x3f3f3f3f queue <int> q; int i…
pre:http://www.cnblogs.com/lokiii/p/8435499.html 和最长k可重区间集问题差不多,也就是价值的计算方法不一样,但是注意这里可能会有x0==x1的情况也就是l==r的情况,然后就TTTTTLE. 其实处理方法很粗暴,因为是开线段,所以可以把它扩大一倍,然后就可以取精度差,对于l!=r,l++,否则l--. 然后正常建模即可. 这个建模大概是用了取补集的思想,把覆盖和没覆盖相转化. #include<iostream> #include<cstd…
死于开小数组的WA?! 第一问n方dp瞎搞一下就成,f[i]记录以i结尾的最长不下降子序列.记答案为mx 第二问网络流,拆点限制流量,s向所有f[i]为1的点建(s,i,1),所有f[i]为mx(i+n,t,1),然后对于j<i&&a[j]<=a[i]&&f[i]==f[j]+1连接(j+n,i,1)表示可以转移,然后跑dinic记录答案ans 第三问也是网络流但是不用重建图,直接在残量网络上加上(1,1+n,inf)(s,1,inf),如果f[n]==mx,(…
题目背景 DJL为了避免成为一只咸鱼,来找Johann学习怎么求最长公共子序列. 题目描述 经过长时间的摸索和练习,DJL终于学会了怎么求LCS.Johann感觉DJL孺子可教,就给他布置了一个课后作业: 给定两个长度分别为n和m的序列,序列中的每个元素都是正整数.保证每个序列中的各个元素互不相同.求这两个序列的最长公共子序列的长度. DJL最讨厌重复劳动,所以不想做那些做过的题.于是他找你来帮他做作业. 输入输出格式 输入格式: 第一行两个整数n和m,表示两个数列的长度. 第二行一行n个整数a…
题目描述 给定平面 x-O-yx−O−y 上 nn 个开线段组成的集合 II ,和一个正整数 kk .试设计一个算法,从开线段集合 II 中选取出开线段集合 S\subseteq IS⊆I ,使得在 xx 轴上的任何一点 pp ,SS 中与直线 x=px=p 相交的开线段个数不超过 kk ,且\sum\limits_{z\in S}|z|z∈S∑​∣z∣ 达到最大.这样的集合 SS 称为开线段集合 II 的最长 kk 可重线段集.\sum\limits_{z\in S}|z|z∈S∑​∣z∣ 称…
题目描述 对于给定的开区间集合 I 和正整数 k,计算开区间集合 I 的最长 k可重区间集的长度. 输入输出格式 输入格式: 的第 1 行有 2 个正整数 n和 k,分别表示开区间的个数和开区间的可重迭数.接下来的 n行,每行有 2 个整数,表示开区间的左右端点坐标. 输出格式: 将计算出的最长 k可重区间集的长度输出 输入输出样例 输入样例#1: 复制 4 2 1 7 6 8 7 10 9 13 输出样例#1: 复制 15 说明 对于100%的数据,1\le n\le 5001≤n≤500 ,…
题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子序列的长度 输入输出样例 输入样例#1: 复制 5 3 2 1 4 5 1 2 3 4 5 输出样例#1: 复制 3 说明 [数据规模] 对于50%的数据,n≤1000 对于100%的数据,n≤100000 首先把第一个序列里面的数在第二个序列里面对应hash一下 然后就转化成了求最长上升子序列的问…
相当与一个拓扑排序的模板题吧 蒟蒻的辛酸史 题目大意:给你一个有向无环图,让你求出1到n的最长路,如果没有路径,就输出-1 思路:一开始以为是一个很裸的拓扑排序 就不看题目,直接打了一遍拓扑排序 然后就得到了45分的成绩 #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<cmath> #define int long long int us…
传送门 思路 这么一道签到题竟然没切掉真是丢人呢-- 首先有一个\(O(3^n)\)的SB方法,记录\(dp_{S,T}\)表示已经填进去了\(S\),当前最大前缀和集合为\(T\),随便转移.太简单了就不细讲了. 挖掘一下题目的性质:一个序列必然可以被分成两部分:前面的前缀和&后面的部分. 后面的部分满足一个性质:任意前缀和都<0,所以很容易DP. 前面可以考虑每次往数列前面加数,那么就必须要满足原来的数列总和\(\ge 0\),也很容易DP,具体可以见代码. 然后就做完了--我这都不会真…
题目传送门 题目背景 丹青千秋酿,一醉解愁肠.无悔少年枉,只愿壮志狂. 题目描述 小$F$很喜欢数学,但是到了高中以后数学总是考不好.有一天,他在数学课上发起了呆:他想起了过去的一年.一年前,当他初识算法竞赛的时候,觉得整个世界都焕然一新.这世界上怎么会有这么多奇妙的东西?曾经自己觉得难以解决的问题,被一个又一个算法轻松解决.小$F$当时暗自觉得,与自己的幼稚相比起来,还有好多要学习的呢.一年过去了,想想都还有点恍惚.他至今还能记得,某天晚上听着入阵曲,激动地睡不着觉,写题写到鸡鸣时分都兴奋不已…
题目描述 输入n个正整数,(1<=n<=10000),要求输出最长的连号的长度.(连号指从小到大连续自然数) 输入输出格式 输入格式: 第一行,一个数n; 第二行,n个正整数,之间用空格隔开. 输出格式: 一个数,最长连号的个数. 输入输出样例 输入样例#1: 复制 10 3 5 6 2 3 4 5 6 8 9 输出样例#1: 复制 5 [代码]: #include<bits/stdc++.h> using namespace std; const int INF = 0x3f3f…
//拓扑排序求最长路 #include<bits/stdc++.h> #include<queue> using namespace std; const int INF=0x3f3f3f3f; ; ; struct edge{ int dis,to;edge *Nex; }tmp[maxm],*head[maxn]; ; bool v[maxn];//标记数组 把从起点(第一个点)能到的点打标记 确保所求最长路都能从点1到达 inline void add(int x,int y…
啊啊啊,再把MAXN和MAXM搞反我就退役 层次图求不相交路径数 第一问简单DP 第二问想办法把每一个不上升子序列转化成DAG上的一条路径,就转换成了求不相交路径数 因为每一个数只能用一次,所以要拆点 对与dp[i]==1连一条从s到i的边,对于dp[i]==ans1连一条从i到t的边 对于dp[j]==dp[i]+1,且num[j]>=num[i],连一条从i到j的边, 跑最大流即可 第三问将对应的边容量改为inf即可 #include <iostream> #include <…
传送门:https://www.luogu.org/problem/show?pid=4551 在看这道题之前,我们应懂这道题怎么做:给定n个数和一个数m,求m和哪一个数的异或值最大. 一种很不错的做法是将n个数按二进制从最高位到低位建立一个trie树,然后把m放在trie树上跑一遍. 因为是从高位到低位存的,所以对于每一位,我们只要贪心让这一位的异或值得1.即如果m得当前位是1,就在trie树上找0:否则就找1.若能找到,ans的这一位就是1,否则是0. 如果上述这道水题会了的话,这道题就不难…
传送门 直接把每个点到根节点的异或距离插入01trie. 然后枚举每个点在01trie上匹配来更新答案就行了. 代码: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; inline int read(){ int ans=0; char ch=getchar(); while(!isdigit(ch))ch=getch…
题目传送门 这道题我是打暴力的...(尴尬) 所以直接是O(N2)的时间,但好像没有炸,数据很水... #include<bits/stdc++.h> using namespace std; ],ans; int main(){ scanf("%d",&n); ;i<=n;i++) scanf("%d",&a[i]); ;i<=n;i++){ ,j=i; ;j<=n&&a[j]==a[j-]+;j++)…
传送门 因为一个zz错误调了一个早上……汇点写错了……spfa也写错了……好吧好像是两个…… 把数轴上的每一个点向它右边的点连一条边,容量为$k$,费用为$0$,然后把每一个区间的左端点向右端点连边,容量为$1$,费用为区间长度,然后求一个最大费用最大流.因为坐标太大,记得离散 然而并不是很明白为什么这样做是对的……想了想,把网络流当成一个水流好了,水从左流到右,那么如果是在一个区间内,不可能满流(因为被区间左端点至右端点那一条边给分去了一部分流),但是被分去的那一部分流会在区间右端点被流回来,…