CodeForces 126B Password

整个比赛都在搞这个题,还不知道哪里不对。

其实这个题如果用kmp做主要卡在这么几个地方:
首先要读懂题,aaaaaa的对应答案是aaaa,四个a,也就是说prefix是在不包括最后一个字符的范围内检索,suffix是在不包括第一个字符的区域检索,中间那个则是在既不包括第一个字符也不包括最后一个字符的范围内检索。
然后Next数组要机智地用好,就是说当前模版串失配之后,机智的方法是利用当前模版串的next数组,直接构造出下一个可能的模版串,而不是一次只删掉末尾的一个字符,再重新扫描这种暴力方法。

其实这个题上面两点我都没想到,更要命的是我的next数组构造方式就存在问题。

在这里重申一下正确的next数组构造方式,首先next[0] = 0,next[1]  = 0(next[0]=-1也是可以的),这个没什么好说的,然后要注意,在进行到中间的时候,首先检查next[当前位]对应的字符是不是和现在的字符相等,相等就在当前next的基础上+1,赋值给下一位的next,如果没有匹配上这个时候不是简单的归零,而是要把当前的比较位置更新成当前比较位置对应的next值的对应位置,也就是一定要迭代回去。(我就是因为没有迭代,next数组整个就是错误的)

POJ 3461 Oulipo

在标准KMP的基础上,在匹配完后,继续匹配而不停止,只是给计数器加一下。

第一次自己写KMP,我已逼实。

Scroll to top