KMP简单应用
KMP简单应用
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
#include <stdio.h> #include <string.h> char S[1000010], T[100010]; int next[100010]; void Get_Next() { int i = 0, j = -1, len = strlen(T); next[0] = -1; while(i < len) { if(j == -1 || T[i] == T[j]) { ++i; ++j; next[i] = j; } else { j = next[j]; } } } int KMP() { int len1 = strlen(S), len2 = strlen(T); int i = 0, j = 0; while(i < len1 && j < len2) { if(S[i] == T[j] || j == -1 ) { ++i; ++j; } else { j = next[j]; } } if(j >= len2) return i-len2+1; else return -1; } void Solve() { while(~scanf("%s", S)) { scanf("%s", T); Get_Next(); int Ans = KMP(); printf("%d\n", Ans); } } int main() { //freopen("data.in", "r", stdin); Solve(); return 0; }
每天训练发现我比别人做的好慢,但是理解的更深刻,如果一开始学一个新知识点就搜模板,那么这样的人是走不远的,毕业之后带走的只有思维,什么荣誉,奖杯都已经不重要了。