KMP模板题
题目描述
牛牛每天都要做的事就是读书,从书里找自己喜欢的句子,他每天都会去读一本书,如果牛牛今天读的书的某连续{}kk个字符刚好是牛牛喜欢句子的某个前缀,那么牛牛将得到{}kk点兴奋感,但他每天只能注意到一次自己喜欢的句子(也就是每天只能增加一次兴奋感),也就是说他会尽量去找那个让自己兴奋度增加最多的句子,那么,{}nn天之后牛牛总共最多能有多少兴奋感?
题目分析:很不巧,我不会kmp,而且个人不打算进一步学习KMP,但是我因为这个题目也看了一下午的kmp,kmp是一个精妙的算法,避开了暴力所带来的时间大的问题,通过跳跃的方式,很好的找到了匹配的子串的位置
给出参考链接:https://blog.csdn.net/yyzsir/article/details/89462339
https://blog.csdn.net/v_july_v/article/details/7041827#t10
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
string pa, str;
int a[maxn];
void getnext()
{
int i = 0, j = -1, len = pa.length();
a[i] = j;
while (i < len)
{
while (j != -1 && pa[i] != pa[j])
j = a[j];
a[++i] = ++j;
}
}
int Kmp()
{
int res = 0;
int i = 0, j = 0, lens = str.length(), lenp = pa.length();
while (i < lens && j < lenp)
{
while (j != -1 && str[i] != pa[j])
j = a[j];
i++, j++;
res = max(res, j);
if (res == lenp)
return res;
}
return res;
}
int main()
{
cin >> pa;
getnext();
int n, ans = 0;
scanf("%d", &n);
while (n--)
{
cin >> str;
ans += Kmp();
}
printf("%d\n", ans);
return 0;
}

京公网安备 11010502036488号