博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
csu 1598(KMP)
阅读量:5060 次
发布时间:2019-06-12

本文共 1763 字,大约阅读时间需要 5 分钟。

1598: 最长公共前缀

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 109  Solved: 92
[][][]

Description

给定两个字符串s和t,现有一个扫描器,从s的最左边开始向右扫描,每次扫描到一个t就把这一段删除,输出能发现t的个数。

Input

第一行包含一个整数T(T<=50),表示数据组数。

每组数据第一行包含一个字符串s,第二行一个字符串t,字符串长度不超过1000000。

Output

对于每组数据,输出答案。

Sample Input

2abababababababba

Sample Output

32

HINT

Source

 

放一个KMP算法模板吧。。还没怎么做过KMP的题.

#include 
#include
#include
#include
#include
using namespace std;const int N = 1000002;int Next[N];char S[N], T[N];int slen, tlen;void getNext(){ int j, k; j = 0; k = -1; Next[0] = -1; while(j < tlen) if(k == -1 || T[j] == T[k]) Next[++j] = ++k; else k = Next[k];}/*返回模式串T在主串S中首次出现的位置返回的位置是从0开始的。*/int KMP_Index(){ int i = 0, j = 0; getNext(); while(i < slen && j < tlen) { if(j == -1 || S[i] == T[j]) { i++; j++; } else j = Next[j]; } if(j == tlen) return i - tlen; else return -1;}/*返回模式串在主串S中出现的次数*/int KMP_Count(){ int ans = 0; int i, j = 0; if(slen == 1 && tlen == 1) { if(S[0] == T[0]) return 1; else return 0; } getNext(); for(i = 0; i < slen; i++) { while(j > 0 && S[i] != T[j]) j = Next[j]; if(S[i] == T[j]) j++; if(j == tlen) { ans++; j = Next[j]; } } return ans;}int main(){ int tcase; scanf("%d",&tcase); while(tcase--) { scanf("%s%s",S,T); slen = strlen(S); tlen = strlen(T); printf("%d\n",KMP_Count()); } return 0;}

 

转载于:https://www.cnblogs.com/liyinggang/p/5766506.html

你可能感兴趣的文章
第9课 uart
查看>>
Range和xrange的区别
查看>>
STL容器之vector
查看>>
无法向会话状态服务器发出会话状态请求
查看>>
数据中心虚拟化技术
查看>>
01入门
查看>>
复习文件操作
查看>>
C#Hashtable与Dictionary性能
查看>>
10个让你忘记 Flash 的 HTML5 应用演示
查看>>
SQL Server 使用作业设置定时任务之一(转载)
查看>>
Primary definition
查看>>
第二阶段冲刺-01
查看>>
BZOJ1045 HAOI2008 糖果传递
查看>>
发送请求时params和data的区别
查看>>
JavaScript 克隆数组
查看>>
eggs
查看>>
一步步学习微软InfoPath2010和SP2010--第七章节--从SP列表和业务数据连接接收数据(4)--外部项目选取器和业务数据连接...
查看>>
如何增强你的SharePoint 团队网站首页
查看>>
FZU 1914 Funny Positive Sequence(线性算法)
查看>>
oracle 报错ORA-12514: TNS:listener does not currently know of service requested in connec
查看>>