题目描述 Description
给出字符串a和字符串b,保证b是a的一个子串,请你输出b在a中第一次出现的位置。
输入描述 Input Description
仅一行包含两个字符串a和b
输出描述 Output Description
仅一行一个整数
样例输入 Sample Input
abcd bc
样例输出 Sample Output
2
数据范围及提示 Data Size & Hint
字符串的长度均不超过100
Pascal用户请注意:两个字符串之间可能包含多个空格
kmp模板题
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn=107;
char a[maxn],b[maxn];
int f[maxn];
int main(){
scanf("%s%s",a,b);
int n=strlen(a),m=strlen(b);
f[0]=f[1]=0;
for(int i=1;i<m;i++){
int j=f[i];
while(j&&b[j]!=b[i]) j=f[j];
f[i+1]=b[j]==b[i]?j+1:0;
}
int z=0;
int ans=0;
for(int i=0;i<n;i++){
while(z&&b[z]!=a[i]) z=f[z];
if(a[i]==b[z]) z++;
if(z==m){
printf("%d",i-m+2);
return 0;
}
}
return 0;
}