犯蠢合集,今日最乐


变量重名

应当尽可能地使变量名包括函数名有意义,分清各变量的意义

必要时可以使用namespace进行区分以尽可能避免撞车


树链剖分,查询操作跳跃节点判定

以下是错误代码

1
2
3
4
5
6
//......
while(top[x]!=top[y])
{
if(dep[x]<dep[y])(swap(x,y));//在此处发生错误
//......
}

以下是正确代码

1
2
3
4
5
6
//......
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])(swap(x,y));
//......
}

节点在往上跳的时候,是直接跳到所在链的链顶的,应当比较两个节点所在链的链顶节点之深度,使更深者往上跳

如按照错误代码书写,可能导致跳跃过度从而造成答案计算重复(计算了多余的节点)


树形数据结构查询K小值,向右子树查询时的问题

常出现于平衡树,权值线段树等问题中

xx等于当前节点的左儿子管辖范围内元素个数

若通过查询xx得知kk小值不在左子树中,向右子树递归

此时应注意进入下一层递归后,应修改kk的值为kxk-x以在右子树中获得正确的答案!

判断结构和循环结构下的逗号与压行问题

逗号和压行可以令代码看上去更加简洁

但在使用时应当十分谨慎,在判断结构循环结构中使用时更应注意结构的有效范围

if后面出问题是绝对调不出来的

FFT/NTT等数组大小的问题

由于需要将多项式扩展到2n2^n项,因而数组大小至少要开4488

SAM的状态数问题

后缀自动机的状态数是O(T2)O(|T|^2)的,所有与状态数有关的数组都要开两倍大小,或者索性把maxn设成两倍

树形数据结构的标记上传和下传问题

时刻注意操作前/后是否需要进行信息上传/下传,如线段树,LCT,splay等都需要格外注意

Manacher的特殊字符插入

插入特殊字符时,必须使原字符串中的所有字符两侧均有特殊字符,并且字符串数组前必须插入一个更加特殊的字符

因此,插入特殊字符后的串必须从1开始存储

例子:

1
2
3
4
5
6
7
8
9
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);