【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;
        }
    }
}

 

posted @ 2016-02-14 17:48  mengyue  阅读(211)  评论(0编辑  收藏  举报