hdu 2087 剪花布条(数据结构:KMP)
2014-08-14 17:17
399 查看
典型的字符串匹配题目
但是不能直接用模板来做,因为对于下面这个例子:
aaaaaa aa
用KMP得出的结果是5
但答案==3,原因是匹配的串中不能重合
所以我们要在匹配成功后做一些处理保证不会出现重合的匹配串
我的做法是当匹配时
令 i += len2-1
其中len2为模式串的长度,这样可以保证直接跳过匹配成功的部分
代码如下:
但是不能直接用模板来做,因为对于下面这个例子:
aaaaaa aa
用KMP得出的结果是5
但答案==3,原因是匹配的串中不能重合
所以我们要在匹配成功后做一些处理保证不会出现重合的匹配串
我的做法是当匹配时
令 i += len2-1
其中len2为模式串的长度,这样可以保证直接跳过匹配成功的部分
代码如下:
#include <cstdio> #include <cstdio> #include <cstring> #include <algorithm> #define MAXN 1100 using namespace std; int next[MAXN]; char str[MAXN], chs[MAXN]; void get_next(char p[]) { int len = strlen(p); int i = 0, j = -1; next[0] = -1; while(i < len) { if(j==-1 || p[i]==p[j]) { ++i, ++j; next[i] = j; } else j = next[j]; } } int kmp(char t[], char s[]) { int ans, i, j, len1, len2; ans = i = j = 0; len1 = strlen(t); len2 = strlen(s); get_next(s); while(i < len1) { if(j==-1 || t[i]==s[j]) ++i, ++j; else j = next[j]; if(j == len2) { ans++; i += len2-1; } } return ans; } int main(void) { while(scanf("%s", str) && str[0]!='#') { scanf("%s", chs); int ans = kmp(str, chs); printf("%d\n", ans); } return 0; }
相关文章推荐
- HDU - 2087 剪花布条 (KMP)
- HDU 2087 剪花布条 KMP题解
- HDU-2087-剪花布条 KMP
- [HDU 2087]剪花布条[kmp非重叠匹配]
- HDU 2087 剪花布条 (kmp)
- HDU- KMP模板题 - 1686 Oulipo - 2087 剪花布条 - 3746 Cyclic Nacklace
- hdu 2087 剪花布条 KMP水题。。
- HDU 2087 剪花布条 kmp
- 剪花布条 - HDU 2087(简单KMP | 暴力)
- HDU 2087 剪花布条 KMP入门
- HDU 2087 剪花布条 //简单kmp
- HDU 2087 (KMP不可重叠的匹配) 花布条
- hdu 2087 剪花布条 KMP
- hdu 2087剪花布条 (KMP入门 子串出现的次数和子串个数)
- HDU 2087 剪花布条 KMP入门
- HDU 2087 剪花布条 KMP
- hdu 2087 剪花布条 KMP
- hdu-2087 剪花布条 【kmp】
- HDU 2087 剪花布条 KMP
- 【kmp字符串匹配】hdu 2087 剪花布条