题意:喻园路上一共有n棵树,有k种类别,教练想回旅馆但是忘了具体在哪个位置,只记得旅馆前m棵树的种类,而且他还可能把一种种类当成另外一种。求旅馆可能所在的位置的数目。
思路:基于教练记得的序列,要找旅馆可能在的位置,其实就是在原序列中找跟记得的序列格式相同的序列数目。例如教练记得是2,9,1,2,1。那么只要在原序列长为5的子序列中找到第一个和第四个相同,第三个和第五个相同,第二个与其余都不同的即可。那么由于是找格式,只要把两个序列都转换成格式来描述,用kmp即可解决。例如(2,9,1,2,1)/(1,3,4,1,4)/(5,1,3,5,3)......这样相同格式的序列,序列中某个元素与在序列中位于它之前的与它相等的元素的差值都是一致的,若不存在则=-1。均为(-1,-1,-1,3,2)。那么我们即可通过这个操作转化,即可通过kmp解决。此外,对于原序列来说若有差值>=m的也要记为-1,或是差值不小于其当前匹配的相应的模式串的位置也要记为-1。
#include<cstdio>
#include<iostream>
#include&