输入输出样例
输入 #1
welcometochuanzhicupchuanzhi
输出 #1
2
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
constexpr int N = 5e5, inf = 0x3f3f3f3f;
char p[N], s[N];
int ne[N];
// s[]是长文本,p[]是模式串,
int ans = 0;
//下标由1开始读入;
void kmp(int n, int m) // n为长,m为短;(代表的是长度)
{
// 求ne数组
for (int i = 2, j = 0; i <= m; i++)
{
while (j && p[i] != p[j + 1])
j = ne[j];
if (p[i] == p[j + 1])
j++;
ne[i] = j;
}
// 匹配
for (int i = 1, j = 0; i <= n; i++)
{
while (j && s[i] != p[j + 1])
j = ne[j];
if (s[i] == p[j + 1])
j++;
if (j == m)
{
j = ne[j];
// 匹配成功后的逻辑
ans++;
}
}
}
void solve()
{
cin >> s + 1;
char arr[] = "chuanzhi";
for (int i = 0; i < 9; i++)
{
p[i + 1] = arr[i];
}
int cnt = 0;
for (int i = 1; s[i]; i++)
{
cnt++;
}
kmp(cnt, 8);
cout << ans;
}
signed main()
{
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
solve();
return 0;
}