hiho1625 重复字符串匹配(重复拼接成母串)

版权声明: 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;
}

猜你喜欢

转载自blog.csdn.net/weixin_39778570/article/details/81910101