CSU 1598: 最长公共前缀(KMP)

原创 2017年08月13日 09:44:01

CSU 1598: 最长公共前缀 KMP

Description

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

Input

第一行包含一个整数T(T<=50),表示数据组数。
每组数据第一行包含一个字符串s,第二行一个字符串t,字符串长度不超过1000000。

Output

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

Sample Input

2
ababab
ab
ababab
ba

Sample Output

3
2

Hint

Source

国防科学技术大学第十八届银河之光文化节ACM程序设计竞赛初赛

思路: KMP模板题

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <set>
//include <map>

using namespace std;
char s1[1000005];
char s2[1000005];
int Next[1000005];
int n,m;
int ans;
int match()
{
    for(int i = 0 , j = 0 ; i < n ;)
    {
        if(s1[i] == s2[j]){
            i++,j++;
            if(j == m){
                ans++;
                j = 0;
            }
        }else if(j == 0) i++;
        else j = Next[j];
    }
    return -1;
}


int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        scanf("%s%s",s1,s2);
        n = strlen(s1);
        m = strlen(s2);
        ans = 0;
        Next[0] = Next[1] = 0;
        for(int i = 1 ; i < m ; i++){
            int k = Next[i];
            while(s2[i] != s2[k] && k != 0)
                k = Next[k];
            if(s2[i] == s2[k])
                Next[i+1] = k + 1;
            else Next[i+1] = 0;
        }
        match();
        cout<<ans<<endl;

    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

CSU 1598 最长公共前缀 【KMP】

Description 给定两个字符串s和t,现有一个扫描器,从s的最左边开始向右扫描,每次扫描到一个t就把这一段删除,输出能发现t的个数。 Input 第一行包含一个整数T(T ...
  • Bcwan_
  • Bcwan_
  • 2016年10月08日 02:24
  • 212

CSU 1598 最长公共前缀

1598: 最长公共前缀 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 73  Solved: 62 [Submit][Status][Web Bo...
  • lizhaowei213
  • lizhaowei213
  • 2015年08月13日 09:12
  • 306

CSU 1598 最长公共前缀 KMP连续匹配

Problem D: 最长公共前缀 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 63  Solved: 52 [Submit][Status...
  • wr132
  • wr132
  • 2015年05月04日 07:40
  • 422

后缀数组 CSU - 1598 最长公共前缀

1598: 最长公共前缀 Time Limit: 1 Sec  Memory Limit: 128 MB Description 给定两个字符串s和t,现有一个扫描器,从s的最左...
  • betwater
  • betwater
  • 2016年08月31日 22:08
  • 95

{算法}所谓ExKmp

你想学会ExKmp吗? 首先 在心中说: ExKmp其实很简单的 毕竟名字里还有个KMP 所以没有学过KMP的同学请参见 M67大神的KMP{看得懂} 本蒟蒻的辣鸡广告{点一下 或更多} E...
  • FarmerJohnOfZS
  • FarmerJohnOfZS
  • 2017年02月23日 19:42
  • 2086

UVA1598

思路:每个优先级队列分别存储sell和buy,每个指令后都判断是否产生交易 package test; import java.util.Comparator; import java.util....
  • kangaroo835127729
  • kangaroo835127729
  • 2015年02月10日 15:46
  • 817

LintCode-最长公共前缀

给k个字符串,求出他们的最长公共前缀(LCP) 您在真实的面试中是否遇到过这个题?  Yes 样例 在 "ABCD" "ABEF" 和 "ACEF" 中,  LCP 为 "...
  • wangyuquanliuli
  • wangyuquanliuli
  • 2015年06月25日 18:55
  • 5308

lintcode ---- 最长公共前缀

思路:只要不相等就返回,否则res一直累加! string longestCommonPrefix(vector &strs) { // write your c...
  • u012850192
  • u012850192
  • 2016年06月16日 13:38
  • 228

后缀数组--(最长公共前缀)

问题描述:给一个字符串,询问某两个后缀的最长公共前缀。   解析:当然用后缀数组最方便,在后缀数组中有很多重要的定义和性质,现在我们来认识一些: 定义:LCP(i,j)=suffix(SA[i]...
  • ACdreamers
  • ACdreamers
  • 2013年06月18日 14:13
  • 4439

hdu1403 求最长公共前缀 后缀数组

#include #include #include #include #include #include #include #include #include using namespace std...
  • zjck1995
  • zjck1995
  • 2015年09月01日 16:26
  • 471
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CSU 1598: 最长公共前缀(KMP)
举报原因:
原因补充:

(最多只允许输入30个字)