KMP

1204 尋找子串位置
時間限制: 1 s
空間限制: 128000 KB
題目等級 : 青銅 Bronze
題解
題目描述 Description
給出字符串a和字符串b,保證b是a的一個子串,請你輸出b在a中第一次出現的位置。ios

輸入描述 Input Description
僅一行包含兩個字符串a和bc++

輸出描述 Output Description
僅一行一個整數spa

樣例輸入 Sample Input
abcd bccode

樣例輸出 Sample Output
2ip

數據範圍及提示 Data Size & Hint
字符串的長度均不超過100字符串

Pascal用戶請注意:兩個字符串之間可能包含多個空格get

分類標籤 Tags 點此展開string

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
#define LL long long
int read()
{
    int s=0,f=1;char ch=getchar();
    while(!('0'<=ch&&ch<='9')){if(ch=='-')f=-1;ch=getchar();}
    while('0'<=ch&&ch<='9'){s=(s<<3)+(s<<1)+ch-'0';ch=getchar();}
    return s*f;
}
int n,m,fail[100005];
char a[100005],b[100005];
int main()
{
    scanf("%s%s",a+1,b+1);
    n=strlen(a+1);
    m=strlen(b+1);
    for(int i=2,j=0;i<=m;i++)
       {
        while(j&&b[j+1]!=b[i])j=fail[j];
        j+=(b[j+1]==b[i]);
        fail[i]=j;
       }
    for(int i=1,j=0;i<=n;i++)
       {while(j&&b[j+1]!=a[i])j=fail[j];
        if(b[j+1]==a[i])j++;
        if(j==m)
           {printf("%d\n",i-m+1);
            break;
           }
       }
    return 0;
}
相關文章
相關標籤/搜索