数据结构实验之串一:KMP简单应用
Time Limit: 1000MS Memory Limit: 65536KB
Problem Description
给定两个字符串string1和string2,判断string2是否为string1的子串。
Input
输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。
Output
对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。
Example Input
abc a 123456 45 abc ddd
Example Output
1 4 -1
DQE:
KMP算法的经典应用,可自己推算一下或查阅相关资料。
#include <iostream> #include <cstdio> using namespace std; int strlen(char *s) { ; while(s[i]!='\0') { i++; } return i; } void cnext(char *s,int *next) { int l=strlen(s); ,j=-; next[i]=j; ) { ||s[i]==s[j]) { i++; j++; next[i]=j; } else { j=next[j]; } } } int kmp(char *s1,char *s2,int *next) { int l1=strlen(s1),l2=strlen(s2); ,j=; while(i<l1&&j<l2) { ||s1[i]==s2[j]) { i++; j++; } else { j=next[j]; } } if(j>=l2) ; ; } int main() { ],s2[]; ]; //此处用static不完全等同于放到全局变量 while(gets(s1)) { gets(s2); cnext(s2,next); printf("%d\n",kmp(s1,s2,next)); } ; } /*************************************************** User name: *** Result: Accepted Take time: 68ms Take Memory: 1012KB Submit time: 2016-11-02 21:33:59 ****************************************************/