hiho 1625 重复字符串匹配 [Offer收割]编程练习赛35 Problem C KMP模板题
来源:互联网 发布:js事件兼容性写法 编辑:程序博客网 时间:2024/05/21 10:18
题目3 : 重复字符串匹配
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
- 样例输入
2hiho hohihohi hiho coder
- 样例输出
3-1
描述
给定两个字符串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。
#include <iostream>#include <stdio.h>#include <math.h>#include <stdlib.h>#include <string>#include <string.h>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <stack>#include <bits/stdc++.h>using namespace std;int T;string A,B;/*class Solution(object): def strStr(self, haystack, needle): """ :type haystack: str :type needle: str :rtype: int """ if needle=="":return 0 Len1=len(haystack) Len2=len(needle) if Len2>Len1:return -1 Next=[0]*(Len2+1) i=0 j=0 t=-1 Next[0]=-1 while j<Len2: if t<0 or needle[j]==needle[t]: j+=1 t+=1 Next[j]=t else: t=Next[t] i=0 j=0 while i<Len1 and j<Len2: if j<0 or haystack[i]==needle[j]: if j+1==Len2:return i-j i+=1 j+=1 else: j=Next[j] return -1*/int Next[100009];int KMP(string s,string p){ int len1=s.length(); int len2=p.length(); memset(Next,0,sizeof(Next)); int i=0; int j=0; int t=-1; Next[0]=-1; while(j<len2){ if(t<0||p[j]==p[t]){ j+=1; t+=1; Next[j]=t; } else{ t=Next[t]; } } i=0; j=0; while(i<len1&&j<len2){ if(j<0||s[i]==p[j]){ if(j+1==len2)return i-j; i+=1; j+=1; } else{ j=Next[j]; } } return -1;}int main(){ cin>>T; while(T--){ cin>>A>>B;// cout<<A<<endl<<B<<endl; int len1=A.length(); int len2=B.length(); int timesA=(len2-1)/len1+1;//at least string t=""; for(int i=0;i<timesA;i++){ t+=A; } if(KMP(t,B)!=-1){ cout<<timesA<<endl; continue; } t+=A; if(KMP(t,B)==-1){ cout<<-1<<endl; } else{ cout<<timesA+1<<endl; } } return 0;}//// _oo0oo_// o8888888o// 88" . "88// (| -_- |)// 0\ = /0// ___/`---'\___// .' \\| |// '.// / \\||| : |||// \// / _||||| -:- |||||- \// | | \\\ - /// | |// | \_| ''\---/'' |_/ |// \ .-\__ '-' ___/-. /// ___'. .' /--.--\ `. .'___// ."" '< `.___\_<|>_/___.' >' "".// | | : `- \`.;`\ _ /`;.`/ - ` : | |// \ \ `_. \_ __\ /__ _/ .-` / /// =====`-.____`.___ \_____/___.-`___.-'=====// `=---='////// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//// 佛祖保佑 永无BUG//////
阅读全文
1 0
- hiho 1625 重复字符串匹配 [Offer收割]编程练习赛35 Problem C KMP模板题
- hiho 1626 缩写命名 [Offer收割]编程练习赛35 Problem D 二分图匹配
- hiho 1485 尺取法 [Offer收割]编程练习赛11 problem A hiho字符串
- hiho 1487 并查集+搜索 [Offer收割]编程练习赛11 problem C 岛屿3
- hiho 1601 背包DP乱搞 [Offer收割]编程练习赛29 Problem C 最大得分
- hiho 1613 墨水滴 [Offer收割]编程练习赛32 Problem C 优先队列+BFS
- hiho 1617 方格取数 [Offer收割]编程练习赛33 Problem C DP
- hiho 1623 有歧义的号码 [Offer收割]编程练习赛35 Problem A
- hiho 1624 最短游览路线 [Offer收割]编程练习赛35 Problem B
- hiho[Offer收割]编程练习赛1
- hiho 1486 DP+状压 [Offer收割]编程练习赛11 problem B 物品价值
- hiho 1599 dfs乱搞 [Offer收割]编程练习赛29 Problem A 逃离迷宫4
- hiho 1611 气泡图 [Offer收割]编程练习赛32 Problem A 数学公式暴力
- hiho 1612 候选人追踪 [Offer收割]编程练习赛32 Problem B 乱搞
- hiho 1615 矩阵游戏II [Offer收割]编程练习赛33 Problem A 贪心暴力
- hiho 1619 “共同富裕” [Offer收割]编程练习赛34 Problem A 数学
- hiho 1620 股票价格3 [Offer收割]编程练习赛34 Problem B 单调栈
- hiho 1641 热门号码 [Offer收割]编程练习赛37 Problem A
- Java 套接字Socket
- 使用maven下载jar包、source源码和javadoc文档
- java 并发工具包 BlockingQueue-ArrayBlockingQueue
- (6)ManyToMany单向、双向:@JoinTable
- 在分类及预测任务中对高维类别(category)变量的预处理方法
- hiho 1625 重复字符串匹配 [Offer收割]编程练习赛35 Problem C KMP模板题
- jsp 列表分页
- webService快速入门入门系列《5》----自定义拦截器
- 贪心算法初识——对今年暑假不AC问题的两种理解
- 二阶魔方
- Github客户端使用教程(二)
- A*算法(二)——最小堆实现
- C&&C++异常处理(三)
- 【JAVA】四种引用,强弱软虚以及用到的场景