SDUT数据结构实验之串三:KMP应用
2016-08-05 21:41
120 查看
#include<stdio.h> #include<string.h> int n,m; int a[10000010]; int b[10000010]; void get_nextval(int pattern[],int next[]) { int j=0,k=-1; next[0]=-1; while(j<m) { if(k==-1||pattern[j]==pattern[k]) { j++; k++; next[j]=k; } else k=next[k]; } } int kmp(int text[],int pattern[]) { int index=0,i=0,j=0; if(n==0||m==0)return -1; //int len=strlen(pattern); int next[m+1]; get_nextval(pattern,next); while(i<n&&j<m) { if(text[i]==pattern[j]) { i++; j++; } else { index+=j-next[j]; if(next[j]!=-1) j=next[j]; else { j=0; i++; } } } if(j==m) return index+1; else return -1; } int main() { while(~scanf("%d",&n)) { for(int i=0; i<n; i++) scanf("%d",&a[i]); scanf("%d",&m); for(int i=0; i<m; i++) scanf("%d",&b[i]); int k=kmp(a,b); if(k!=-1) { int j=kmp(a+k,b); if(j==-1) printf("%d %d\n",k,k+m-1); else printf("-1\n"); } else printf("-1\n"); } }
相关文章推荐
- SDUT 3311 数据结构实验之串三:KMP应用
- sdut.acm2012级《程序设计基础Ⅱ)》_链表 数据结构实验之链表三:链表的逆置
- SDUT 数据结构上机实验之二分查找
- [2119]数据结构实验之链表四:有序链表的归并 (SDUT)
- 【2118】数据结构实验之链表三:链表的逆置 (SDUT)
- sdut.acm2012级《程序设计基础Ⅱ)》_链表 数据结构实验之链表二:逆序建立链表
- 【2141】数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 (SDUT)
- SDUT-2137 数据结构实验之求二叉树后序遍历和层次遍历
- 【2142】数据结构实验之图论二:基于邻接表的广度优先搜索遍历 (SDUT)
- SDUT 2412 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- SDUT2142数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- SDUT 数据结构上机实验之二分查找
- SDUT-2137数据结构实验之求二叉树后序遍历和层次遍历
- SDUT 2134 数据结构实验之栈四:括号匹配
- SDUT 216 数据结构实验之二叉树的建立与遍历
- 数据结构实验:哈希表(SDUT 1480)
- 数据结构实验之链表三:链表的逆置 (SDUT 2118)
- SDUT 2136 数据结构实验之二叉树的建立与遍历
- [2119]数据结构实验之链表四:有序链表的归并 (SDUT)
- SDUT-2136 数据结构实验之二叉树的建立与遍历