【CODEVS1204】寻找子串位置
Description
给出字符串a和字符串b,保证b是a的一个子串,请你输出b在a中第一次出现的位置。
Input
仅一行包含两个字符串a和b
Output
仅一行一个整数
Sample Input
abcd bc
Sample Output
2
Hint
字符串的长度均不超过100
Pascal用户请注意:两个字符串之间可能包含多个空格
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int fail[1000],f[1000],kmp; int main() { char s1[100],s2[100]; scanf("%s%s",s1+1,s2+1); int l1=strlen(s1+1),l2=strlen(s2+1); fail[1] = 0; for (int i=2;i<=l2;i++) { int p = fail[i-1]; while (p && s2[p+1] !=s2[i]) p=fail[p]; if (s2[p+1] == s2[i]) p++; fail[i] = p; } int p=0; for (int i=1;i<=l1;i++) { while (p && s2[p+1] != s1[i]) p=fail[p]; if (s2[p+1] == s1[i]) p++; f[i] = p; if (p == l2) { printf("%d",i-l2+1); break; } } }