首先先奉上什么是KMP表的链接,不然题目没法做呀
https://blog.csdn.net/weixin_52622200/article/details/110563434
题目:
给你一个主串 ss 和一个模式串 pp,现在问你在串 ss 中 是否能找到串 pp,即串 pp 能否在 ss 串中匹配成功。
注意:输入的所有串只包含小写英文字母。
输入格式
第一行输入模式串 pp;
第二行输入主串 ss。
输出格式
如果模式串 pp 在主串 ss 中出现过,请输出其在主串中最开始出现的下标(即输出 p[0]p[0] 在主串中的下标),如果未出现过请直接输出 -1。
样例 1
样例输入
aaabbasc
bac样例输出
-1
样例 2
样例输入
ababab
ab样例输出
0
样例 3
样例输入
aasggwsagah
wsa样例输出
5
#include<iostream> #include<cstring> using namespace std; const int N = 1e6+10; char p[N], s[N]; int ne[N]; int m, n; int main() { cin >> s + 1 >> p + 1; m = strlen(p + 1); n = strlen(s + 1); //做KMP表(双指针) for(int i = 2, j = 0; i <= m; i ++) { while(j && p[j + 1] != p[i]) j = ne[j]; if(p[j + 1] == p[i]) j ++; ne[i] = j; } //匹配字符串(双指针) for(int i = 1, j = 0; i <= n; i ++) { while(j && p[j + 1] != s[i]) j = ne[j]; if(p[j + 1] == s[i]) j ++; if(j == m) { cout << i - m; return 0; } } cout << "-1"; return 0; }