随笔分类 - poj
摘要:如果next[n]<n/2,一定无解。 否则,必须要满足n mod (n-next[n]) = 0 才行,此时,由于next数组的性质,0~n-next[n]-1的部分一定是最小循环节。 [ab ababababab ab]
阅读全文
摘要:题意大概是让你求(A+Cx) mod 2^k = B的最小非负整数解。 若(B-A) mod gcd(C,2^k) = 0,就有解,否则无解。 式子可以化成Cx + 2^k*y = B - A,可以用扩展欧几里得得到一组解。 设M=gcd(C,2^k),X=x*(B-A)/M 要想得到最小非负整数解
阅读全文
摘要:给你俩凸包,问你它们的最短距离。 咋做就不讲了,经典题,网上一片题解。 把凸包上的点逆时针排序。可以取它们的平均点,然后作极角排序。 旋转卡壳其实是个很模板化的东西…… 先初始化分别在凸包P和Q上取哪个点,一般在P上取纵坐标最小的点,在Q上取纵坐标最大的点 for i=1 to n(n是凸包P上的点
阅读全文
摘要:状压DP裸题,将({当前车票集合},当前顶点)这样一个二元组当成状态,然后 边权/马匹 当成边长,跑最短路或者DAG上的DP即可。#include#include#includeusing namespace std;typedef double db;#define INF 2147483647....
阅读全文
摘要:sa在清空方面存在一些奇怪的问题……难以ac。(留坑?)
阅读全文
摘要:连续重复子串(pku2406)给定一个字符串 L,已知这个字符串是由某个字符串 S 重复 R 次而得到的,求 R 的最大值。算法分析:做法比较简单,穷举字符串 S 的长度 k,然后判断是否满足。判断的时候,先看字符串 L 的长度能否被 k 整除,再看 suffix(1)和 suffix(k+1)的最...
阅读全文
摘要:注意:对整型数组求sa时,s[n]请置成-1。请离散化。可重叠的 k 次最长重复子串(pku3261)给定一个字符串,求至少出现 k 次的最长重复子串,这 k 个子串可以重叠。算法分析:先二分答案,然后将后缀分成若干组。 不同的是,这里要判断的是有没有一个组的后缀个数不小于 k。如果有,那么存在k ...
阅读全文
摘要:差分消除加减一个值得影响,貌似r二分上界要设成(n-2)/2?为啥?sa求不可重叠最长重复子串给定一个字符串,求最长重复子串,这两个子串不能重叠。算法分析:这题比上一题稍复杂一点。先二分答案,把题目变成判定性问题:判断是否存在两个长度为 k 的子串是相同的,且不重叠。解决这个问题的关键还是利用hei...
阅读全文
摘要:考虑奇数长度的回文,对于字符串上的每个位置i,如果知道从i开始的后缀和到i为止的前缀反转后的字符串的lcp长度的话,也就知道了以第i个字符为对称中心的最长回文的长度了。因此,我们用在S中不会出现的字符将S和S反转后的字符串拼接起来,得到字符串S',计算S'的sa。于是,从i开始的后缀和到i为止的前缀...
阅读全文
摘要:考虑简化问题:计算一个字符串中至少出现两次的最长子串。答案一定会在sa中相邻两个后缀的lcp中。因为后缀的位置在sa中相距越远,其lcp的长度就越短,这是由于字典序的性质决定的。于是,在s1和s2中间插入字符'\0',然后等价于寻找两个后缀的lcp的最大值,且这两个后缀分属s1、s2。#includ...
阅读全文
摘要:考虑第一次切割,必然切割的是翻转后字典序最小的前缀,伪证:若切割位置更靠前:则会导致第一个数翻转后更靠前,字典序必然更大。若切割位置更靠后,则显然也会导致字典序更大。↑,sa即可对于第二次切割,有结论:将序列分割成两段再分别翻转得到的序列,可以看作是将两个原序列拼接得到的新序列中的某个字串翻转得到的...
阅读全文
摘要:由于每个点的状态受到其自身和周围四个点的影响,所以可以这样建立异或方程组:引用题解:http://hi.baidu.com/ofeitian/item/9899edce6dc6d3d297445264题目大意:给你一个5*6的矩阵,矩阵里每一个单元都有一个灯和一个开关,如果按下此开关,那么开关所在位...
阅读全文
摘要:由于异或运算满足结合律,我们把当前状态的SG函数定义为 它所能切割成的所有纸片对的两两异或和之外的最小非负整数。#include#include#includeusing namespace std;int n,m,SG[201][201];int sg(int x,int y){ if(SG[x]...
阅读全文
摘要:假设当前b>a。一、b%a==0 必胜二、b2*a,假设x是使得b-ax#includeusing namespace std;long long a,b;int main(){ while(1) { scanf("%lld%lld",&a,&b); if(!a&&!b) break...
阅读全文
摘要:如果当前状态可以根据某条轴线把硬币分成两个相同的组,则当前状态是必败态。因为不论在其中一组我们采取任何策略,对方都可以采取相同的策略,如此循环,对方必然抽走最后一枚硬币。因为我们先手,因此抽完后盘面变成了一个n-1或n-2长度的链,此时对方只需按照奇偶性把某个位置的硬币抽走,就可以让我们达到必败态。...
阅读全文
摘要:模板题。S[i][j]表示i是否存在于第j个集合里。妈蛋poj差点打成poi(波兰无关)是不是没救了。#include#includeusing namespace std;int n,m,x,y;bitsetS[10001];int main(){ scanf("%d",&n); for(int ...
阅读全文
摘要:#includeusing namespace std;#define N 1000001int n,K,a[N],head=1,tail=1,q[N],ans[N];int main(){ scanf("%d%d",&n,&K); for(int i=1;i=head) --tail; q[...
阅读全文
摘要:三道题都很类似。给出1741的代码#include#include#includeusing namespace std;#define MAXN 10001typedef pair Point;int n,K,ans;int v[MAXN<<1],w[MAXN<<1],first[MAXN],ne...
阅读全文
摘要:先用莫队算法保证在询问之间转移的复杂度,每次转移都需要进行O(sqrt(m))次插入和删除,权值分块的插入/删除是O(1)的。然后询问的时候用权值分块查询区间k小值,每次是O(sqrt(n))的。所以总共的复杂度是O(m*(sqrt(n)+sqrt(m)))的。常数极小。别的按权值维护的数据结构无法...
阅读全文
摘要:经典问题:二维偏序。给定平面中的n个点,求每个点左下方的点的个数。因为 所有点已经以y为第一关键字,x为第二关键字排好序,所以我们按读入顺序处理,仅仅需要计算x坐标小于树状数组。 1 #include 2 #include 3 #include 4 using namespace std; 5 st...
阅读全文

浙公网安备 33010602011771号
