版权声明: https://blog.csdn.net/weixin_39778570/article/details/81910101
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
给定两个字符串A和B,请你求出字符串A最少重复几次才能使得B是A的子串。
例如A=”hiho”,B=”hohihohi”。则A重复3次之后变为”hihohihohiho”,这时B是A的子串。
输入
输入包含多组数据。
第一行包含一个整数T,表示数据组数。 (1 ≤ T ≤ 5)
对于每组数据,第一行包含一个字符串A,第二行包含一个字符串B。
对于30%的数据,1 ≤ |A|, |B| ≤ 1000
对于100%的数据, 1 ≤ |A|, |B| ≤ 100000 并且A和B都只包含小写字母。
输出
A最少重复的次数。如果无论重复多少次也不能包含B,输出-1。
样例输入
2
hiho
hohihohi
hiho
coder
样例输出
3
-1
AC code
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
int nxt[1000001];
int ans, n, m, t;
char p[1000001], s[1000001];
int main(){
scanf("%d", &t);
while(t--){
scanf("%s%s", s+1, p+1);
n = strlen(s+1);
m = strlen(p+1);
ans = -1;
nxt[0] = -1;
int j = -1;
for(int i=1; i<=m; i++){
while(j>=0 && p[j+1]!=p[i]) j = nxt[j];
nxt[i] = ++j;
}
j = 0;
for(int i=1; i<=m+n; i++){
char c = s[(i-1)%n + 1]; // 循环当前字符串
while(j>=0 && p[j+1]!=c) j = nxt[j];
if(++j == m){
// 匹配成功,算出重复了多少遍
ans = (i-1)/n + 1;
break;
}
}
printf("%d\n", ans);
}
return 0;
}