7-3 统计子串 分数 10
作者 黄龙军
单位 绍兴文理学院
编写算法,统计子串t在主串s中出现的次数。
输入格式:
首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据在第一行中输入主串s,在第二行中输入子串t,s和t中不包含空格。
输出格式:
对于每组测试,若子串t在主串s中出现,则输出t在s中的子串位置和出现总次数,否则输出“0 0”。引号不必输出。
输入样例:
2
abbbbcdebb
bb
abcde
bb
输出样例:
2 4
0 0
出处:
黄龙军,等. 数据结构与算法, 上海:上海交通大学出版社, 2022.7. ISBN: 9787313269881
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
string S, T;
int Next[N];
void get_next()
{
int i = 0, j = -1;
Next[i] = -1;
while (i < T.size())
{
if (j == -1 || T[i] == T[j])
{
Next[++i] = ++j;
}
else
j = Next[j];
}
}
int kmp(int pos)
{
int i = pos, j = 0, ans = 0;
while (i < S.size())
{
if (S[i] == T[j] || j == -1)
++i, ++j;
else
j = Next[j];
if (j == T.size())
{
ans++;
if (ans == 1)
cout << i - j + 1 << " ";
// j = Next[j - 1];
// i--;
j = Next[j];
}
}
return ans;
}
int main()
{
int t;
cin >> t;
while (t--)
{
cin >> S;
cin >> T;
get_next();
int ans = kmp(0);
if (ans == 0)
cout << "0 0" << endl;
else
cout << ans << endl;
}
return 0;
}