犯蠢合集,今日最乐
变量重名
应当尽可能地使变量名包括函数名有意义,分清各变量的意义
必要时可以使用namespace进行区分以尽可能避免撞车
树链剖分,查询操作跳跃节点判定
以下是错误代码
//......
while(top[x]!=top[y])
{
if(dep[x]<dep[y])(swap(x,y));//在此处发生错误
//......
}
以下是正确代码
//......
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])(swap(x,y));
//......
}
节点在往上跳的时候,是直接跳到所在链的链顶的,应当比较两个节点所在链的链顶节点之深度,使更深者往上跳
如按照错误代码书写,可能导致跳跃过度从而造成答案计算重复(计算了多余的节点)
树形数据结构查询K小值,向右子树查询时的问题
常出现于平衡树,权值线段树等问题中
令(x)等于当前节点的左儿子管辖范围内元素个数
若通过查询(x)得知(k)小值不在左子树中,向右子树递归
此时应注意进入下一层递归后,应修改(k)的值为(k-x)以在右子树中获得正确的答案!
判断结构和循环结构下的逗号与压行问题
逗号和压行可以令代码看上去更加简洁
但在使用时应当十分谨慎,在判断结构和循环结构中使用时更应注意结构的有效范围
if后面出问题是绝对调不出来的
FFT/NTT等数组大小的问题
由于需要将多项式扩展到(2^n)项,因而数组大小至少要开(4)到(8)倍
SAM的状态数问题
后缀自动机的状态数是(O(|T|^2))的,所有与状态数有关的数组都要开两倍大小,或者索性把maxn设成两倍
树形数据结构的标记上传和下传问题
时刻注意操作前/后是否需要进行信息上传/下传,如线段树,LCT,splay等都需要格外注意
Manacher的特殊字符插入
插入特殊字符时,必须使原字符串中的所有字符两侧均有特殊字符,并且字符串数组前必须插入一个更加特殊的字符
因此,插入特殊字符后的串必须从1开始存储
例子:
scanf("%s",in+1);
int p=strlen(in+1);
str[1]='#',str[0]='^';
for(register int i=1;i<=p;++i)
{
str[i*2]=in[i];
str[i*2+1]='#';
}
n=strlen(str+1);