[题意]给定长度为n和m的两个字符串S和T,要求在字符串S中取出若干段拼成T(可重复取),求最小段数,n,m<=50000. [算法]后缀自动机 || 后缀数组 [题解]对串S建SAM,然后在上面尽可能地匹配T,匹配几次得到T就是答案. #include<cstdio> #include<cstring> #include<algorithm> #include<cctype> using namespace std; ; ];}t[maxn*]; i…
BZOJ_2099_[Usaco2010 Dec]Letter 恐吓信_后缀自动机 Description FJ刚刚和邻居发生了一场可怕的争吵,他咽不下这口气,决定佚名发给他的邻居 一封脏话连篇的信.他有无限张完全相同的已经打印好的信件,都包含 N个字母(1 <= N <= 50,000).他想剪出其中一些并且粘帖成一个很长的字母串. FJ太懒了,他想用最少的次数裁剪信件.他有一把举世无双的剪刀,他可以从 一封信中只剪一刀剪出连续一段.同样,剪一刀可以得到整个完整的字符串. 他想知道他最少需要…
给两个长度不超过50000的串,A串可每次截连续一段复制出来,求最少复制几次能得到B串. 方法一:SAM.不会. 嗯好会了. #include<stdio.h> #include<string.h> #include<algorithm> #include<stdlib.h> //#include<iostream> //#include<time.h> using namespace std; int n,m; #define ma…
跑两遍最短路就好了.. 话说这翻译2333 ---------------------------------------------------------------------- #include<cstdio> #include<queue> #include<algorithm> #include<cstring> #include<iostream>   #define rep( i , n ) for( int i = 0 ; i…
dp( l , r ) = sum( l , r ) - min( dp( l + 1 , r ) , dp( l , r - 1 ) ) 被卡空间....我们可以发现 l > r 是无意义的 , 所以可以省下一半的空间 -------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<a…
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2101 题意: 共有n枚金币,第i枚金币的价值是w[i]. 把金币排成一条直线,Bessie和Bonny轮流取金币,看谁取到的钱最多. Bessie先取,每次只能取一枚金币,而且只能选择取直线两头的金币,不能取走中间的金币.当所有金币取完之后,游戏就结束了. Bessie和Bonny都是非常聪明的,她们会采用最好的办法让自己取到的金币最多. 请帮助Bessie计算一下,她能拿到多少钱? 题…
http://www.lydsy.com/JudgeOnline/problem.php?id=2101 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 539  Solved: 294[Submit][Status][Discuss] Description Bessie and Bonnie have found a treasure chest full of marvelous gold coins! Being cows, though,…
二分答案,然后dp判断是否合法 具体方法是设f[u]为u点到其子树中的最长链,每次把所有儿子的f值取出来排序,如果某两条能组合出大于mid的链就断掉f较大的一条 a是全局数组!!所以要先dfs完子树才能填a!! #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=1000005; int n,m,h…
就是区间dp啦f[i][j]表示以i开头的长为j+1的一段的答案,转移是f[i][j]=s[i+l]-s[i-1]+min(f[i][j-1],f[i+1][j-1]),初始是f[i][1]=a[i] 于是可以把j维推掉 #include<iostream> #include<cstdio> using namespace std; const int N=5005; int n,a[N],s[N]; int main() { scanf("%d",&n…
洛谷数据好强啊,普通spfa开o2都过不了,要加双端队列优化 因为是双向边,所以dis(u,v)=dis(v,u),所以分别以pa1和pa2为起点spfa一遍,表示pb-->pa1-->pa2和pb-->pa2-->pa1,取个min即可 #include<iostream> #include<cstdio> #include<queue> using namespace std; const int N=200005,inf=2e9+7; in…