n:0; Work(x,p,l); } } int main() { #ifdef file freopen("uoj172.in","r",stdin); #endif scanf("%d",&T); for (;T;--T) { scanf("%d%lld",&n,&w); scanf("%s",st+1); if (w<n) {printf("0\n");continue;} fo(i,2,n) { nx[i]=nx[i-1]; while (nx[i] &&...
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ172.html 题解 首先,这个问题显然是个背包问题。 然后,可以证明:一个字符串的 border 长度可以划分成 O(log|S|)O(log|S|) 个等差数列。 (以下图片摘自 金策 - 《字符串算法选讲》) 由于长度 n 可以随便取,所以我们可以在对n取模的意义下做背包,设 ...
UOJ#172. 【WC2016】论战捆竹竿 字符串 KMP 动态规划 单调队列 背包,原文链接https://..com/zhouzhendong/p/UOJ172.html题解首先,这个问题显然是个背包问题。然后,可以证明:一个字符串的border长度可以划分成$O(log|S|)$个等差数列。(以下图片摘自金策-《字符串算法选讲
首先这个题目显然就是先求出所有的borderborder,问题转化成一个可行性背包的问题 一个方法就是同余类最短路,裸跑3030分,加优化5050分 首先有个性质 borderborder分成的等差数列的个数不超过loglog 和回文树的性质的证明类似瞎画图一下就行了 我们注意到可以一个一个等差数列的更新最短路 要做到这个,必须能从之前的等...
uoj Description 给定字符串SS,你可以执行一种操作,将SS拼接到当前字符串后,可以重叠,但重叠的位置必须对位相等,要求最终字符串长度不超过mm,现在请你计算最终得到字符串的所有可能长度数量。|S|≤5×105,m≤1018|S|≤5×105,m≤1018 Solution 首先重叠的部分一定是ss的一个borderborder,因此每次操作就等于是给原...
第二次在bzoj跑进前十竟然是因为在UOJ卡常致死 首先这个题其实就是一个无限背包 一般做法是同余最短路,就是bzoj2118: 墨墨的等式可以拿到30分的好成绩 背包是个卷积就分治FFT优化那么下面20也没问题了官方做法是大力bitset优化背包并且嘲讽了一波这个做法
n:0; Work(x,p,l); } } int main() { #ifdef file freopen("uoj172.in","r",stdin); #endif scanf("%d",&T); for (;T;--T) { scanf("%d%lld",&n,&w); scanf("%s",st+1); if (w<n) {printf("0\n");continue;} fo(i,2,n) { nx[i]=nx[i-1]; while (nx[i] &&...