7-1 串的模式匹配
分数 30
全屏浏览题目
切换布局
作者 陈晓梅
单位 广东外语外贸大学
给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串S中出现的位置。
输入格式:
输入有两行:
第一行是主串S;
第二行是模式T.
输出格式:
输出相匹配的子串中的第一个字符在主串S中出现的位置。若匹配失败,输出0.
输入样例:
在这里给出一组输入。例如:
aaaaaba
ba
输出样例:
在这里给出相应的输出。例如:
6
#include <iostream>
#include <algorithm>
using namespace std;
char s[100000010],q[100000010];
int ne[100000010];
int kmp()
{
for(int i = 1 , j = 0; s[i] != '\0' ; i ++)
{
while(j && q[j + 1] != s[i]) j = ne[j];
if(q[j + 1] == s[i]) j ++;
if(q[j + 1] == '\0') return i - j + 1;
}
return 0;
}
int main()
{
cin>>s+1>>q + 1;
ne[1] = -1;
for(int i = 2 , j = 0 ; q[i] != '\0' ; i ++)
{
while(j && q[j + 1] != q[i]) j = ne[j];
if(q[j + 1] == q[i]) j ++;
ne[i] = j;
}
cout << kmp() << endl;
return 0;
}