摘要: 因为s2可以出现在s1的一头一尾,所以要在s1末端补上s1开头的一截长为s2的字符,然后进行一遍kmp。#include #include char a[200020],b[100020];long p[100020];int main(){ long i,j,n,k,x,y; int flag; while(scanf("%s",&a)!=EOF) { flag=0; scanf("%s",&b); x=strlen(a); y=strlen(b); for(i=x;i>0;i--) ... 阅读全文
posted @ 2013-08-18 21:01 贝尔摩德 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 裸的kmp#include long a[1000020],b[10020],p[10020];int main(){ long i,j,n,k,x,y; int flag; scanf("%ld",&n); for(k=0;k0&&b[i]!=b[j+1]) j=p[j]; if(b[i]==b[j+1]) j++; p[i]=j; } j=0; for(i=1;i0&&b[j+1]!=a[i]) j=p[j]; if(b[j+1]... 阅读全文
posted @ 2013-08-18 20:52 贝尔摩德 阅读(133) 评论(0) 推荐(0) 编辑
摘要: 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段。 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP算法是拿来处理字符串匹配的。换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串)。比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串。你可以委婉地问你的MM:“假如你要向你喜欢的人表白的话,我的名字是你的告白语中的子串吗?” 解决这类问题,通常我们的方法是枚举从A串的什么位置起开始与B匹配,然后验证是否匹配。假如A串长度为n,B 阅读全文
posted @ 2013-08-18 20:49 贝尔摩德 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 题目大意:给出一些单词,问能否摆成类似成语接龙的顺序(即前一个单词的最后一个字母要和下一个单词首字母相同)。对于每个单词,只有首尾两字母重要,该单词可看做由首字母到尾字母的一条边,即所有单词的首尾两字母看做图中节点,每个单词可看做一条边,构造好有向图后,若要摆成题意要求的顺序,即判断是否存在欧拉回路即可。#include #include int t,n;char word[1001];//存储每个单词int od[30],id[30];//每个顶点的出度和入度int bused[30],p[30];//bused表示该顶点是否存在,p是并查集中的父节点struct edge{ int u,v 阅读全文
posted @ 2013-08-18 15:28 贝尔摩德 阅读(175) 评论(0) 推荐(0) 编辑