codevs1204 寻找子串位置
题目描述 Description
给出字符串a和字符串b,保证b是a的一个子串,请你输出b在a中第一次出现的位置。
输入描述 Input Description
仅一行包含两个字符串a和b
输出描述 Output Description
仅一行一个整数
样例输入 Sample Input
abcd bc
样例输出 Sample Output
2
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> #include<vector> #include<queue> using namespace std; const int maxn = 2005; int n,m,next[maxn]; char t[maxn],p[maxn]; void input(){ cin>>t>>p; n = strlen(t); m = strlen(p); } void make(){ next[0] = 0; for(int i = 1,k = 0;i < m;i++){ while(k > 0 && p[i] != p[k]) k = next[k-1]; if(p[i] == p[k]) k++; next[i] = k; } } void kmp(){ for(int i = 0,k = 0;i < n;i++){ while(k > 0 && t[i] != p[k]){ k = next[k-1]; } if(t[i] == p[k]) k++; if(k == m){ cout<<i - m + 2; return; } } } int main(){ input(); make(); kmp(); return 0; }