Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
给定两个字符串string1和string2,判断string2是否为string1的子串。
输入
输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。
输出
对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。
示例输入
abc a 123456 45 abc ddd
示例输出
1 4 -1
kmp代码的模板 #include<stdio.h> #include<math.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; char p[1000010];//代表目标串,为上面的一行 char t[1000010];//代表模式串,为下面的 int next[1000010]; void get_next() { int i=0,j=-1,lenp=strlen(p); next[0]=-1; while(i<lenp) { if(j==-1||t[i]==t[j]) next[++i]=++j; else j=next[j]; } } int kmp() { int i=0,j=0,lent=strlen(t),lenp=strlen(p); get_next(); while(i<lent&&j<lenp) { if(j==-1||t[i]==p[j]) { ++i; ++j; } else j=next[j]; } if(j>=strlen(p)) return i-strlen(p); else return -1; } int main() { while(~scanf("%s%s",&t,&p)) { if(kmp()!=-1) printf("%d\n",kmp()+1); else printf("-1\n"); } return 0; }
Description
Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M <= 10000, 1 <= N <= 1000000). Your task is to find a number K which make a[K] = b[1], a[K + 1] = b[2], ...... , a[K + M - 1] = b[M]. If there are more than one K exist, output the smallest one.
Input
The first line of input is a number T which indicate the number of cases. Each case contains three lines. The first line is two numbers N and M (1 <= M <= 10000, 1 <= N <= 1000000). The second line contains N integers which indicate a[1], a[2], ...... , a[N]. The third line contains M integers which indicate b[1], b[2], ...... , b[M]. All integers are in the range of [-1000000, 1000000].
Output
For each test case, you should output one line which only contain K described above. If no such K exists, output -1 instead.
Sample Input
2 13 5 1 2 1 2 3 1 2 3 1 3 2 1 2 1 2 3 1 3 13 5 1 2 1 2 3 1 2 3 1 3 2 1 2 1 2 3 2 1Sample Output
6 -1#include<stdio.h> #include<string.h> #include<stdlib.h> int a[2000100], p[2000100], next[2000100]; void get_next(int k2) { int i = 0, j = -1; next[0] = -1; while (i < k2) { if (j == -1 || p[i] == p[j]) { next[++i] = ++j; } else { j = next[j]; } } } int kmp(int k1,int k2) { int i = 0, j = 0; get_next(k2); while (i < k1 && j < k2) { if (j == -1 || a[i] == p[j]) { ++i; ++j; } else { j = next[j]; } } if (j >= k2) { return i - k2+1; } else { return -1; } } int main() { int i, j, t,m,n,y; scanf("%d", &t); for (int k = 0; k < t; k++) { scanf("%d%d",&n,&m); for (i = 0; i < n; i++) { scanf("%d", &a[i]); } for (j = 0; j < m; j++) { scanf("%d", &p[j]); } //get_next(m); if (kmp(n,m) != -1) { printf("%d\n", kmp(n,m) ); } else { printf("-1\n"); } } return 0; }
提示
来源
cjx