摘要: 给你一个串s,如果能找到一个子串a,连接n次变成它,就把这个串称为power string,即a^n=s,求最大的n.用KMP来想,如果存在的话,那么我每次f[i]的时候退的步数应该是一样多的 譬如ababab 我每次退的一定是2步,检验一下这个串的失配指针是不是这个性质,如果是的话,那么n=strlen(s)/退的步数,否则就是直接1好了.#include#include#include#include#define maxn 1000000int f[maxn+50];char P[maxn+50];void getFail(const char *P,int *f){ int m=str 阅读全文
posted @ 2013-12-22 01:56 chanme 阅读(230) 评论(0) 推荐(0) 编辑
摘要: KMP继续练手.题目问的是一个串前缀等于后缀的可能长度是哪些,输出来.题目考的是对KMP失配指针的理解,当最后一位失配(即'\0'那里)时,指针会移动到前缀对应匹配的部分,所以这个长度是我们要的,然后接着这个新的前缀的失配指针移到的部分,与这个前缀的后缀也是匹配的..这样一直滚下去就可以了得到所有可能的值.贴一记代码.#include#include#include#include#include#include#includeusing namespace std;#define mxp 400050int f[mxp+50];char P[mxp+50];void getF 阅读全文
posted @ 2013-12-22 01:31 chanme 阅读(184) 评论(0) 推荐(0) 编辑
摘要: 这个算法去年的这个时候就已经听过了,看毛片算法哈哈..不过理解它确实花了我很久的时间..以致于我一直很排斥字符串的学习,因为总觉得太难了,但是有些硬骨头还是要啃的,这个寒假就啃啃字符串还有一些别的东西吧,KMP的学习我看了好多好多博客才有那么些头绪,复杂度的分析更是无从谈起,不过线性匹配这样的算法实在太流弊了.~题目是水题,但也算是我的第一道KMP吧.~#include#include#include#include#include#includeusing namespace std;#define mxt 1000005#define mxp 10005#define inf 0x3f3f 阅读全文
posted @ 2013-12-22 00:55 chanme 阅读(154) 评论(0) 推荐(0) 编辑