随笔分类 - kmp(模式匹配)
杭电 2087 剪花布条
摘要:这个题目刚开始觉得测试数据都能过但是一直wa,都找不到错在哪,觉得很有挫败感,但是后来才发现原来由于习惯导致了一个错误。以下为正确代码:#include<stdio.h>#include<string.h>#include<stdlib.h>char a[1010],b[1010];int next[1010];int n,m;void get_next(){ int i=0,j=-1; next[0]=-1; while(i<m-1) { if(b[i]==b[j]||j==-1) { i++; j++; if(b[i]!=b[j]) { next[
阅读全文
杭电 1711 Number Sequence
摘要:#include<stdio.h>#include<string.h>#include<stdlib.h>int a[1000010],b[10010];int next[10010];void get_next(){ int i=1,j=0; next[1]=0; while(i<b[0]) { if(b[i]==b[j]||j==0) { i++; j++; if(b[i]!=b[j]) { next[i]=j; } else { next[i]=next[j]; } } else { j=next[j]; } }}int index_kmp(){
阅读全文
模式匹配
摘要:模式匹配最原始的算法是BF算法:int index_bf(char *s,char *t){ int i,j; i=j=1; while(i<=s[0]&&j<=t[0]) { if(s[i]==t[j]) { i++; j++; } else//主串和模式串都回溯 { i=i-j+2; j=1; } } if(j>t[0])//匹配成功 { return i-t[0]; } else//匹配失败 { return 0; }}之后就是KMP算法,它是BF算法的一种优化,当主串匹配失败时,不必回溯,只需要将模式串回溯一部分即可,这样就大大节省了时间:int in
阅读全文