CSU 1598 最长公共前缀 (简单KMP或者暴力)

Submit Page    Summary    Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 226     Solved: 189


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

KMP:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<memory>
using namespace std;
char moban[1005],wenben[1005];
int next1[1005];
int sum;
void getnext(char* s,int* next1,int m)
{
    next1[0]=0;
    next1[1]=0;
    for(int i=1;i<m;i++)
    {
        int j=next1[i];
        while(j&&s[i]!=s[j])
            j=next1[j];
        if(s[i]==s[j])
            next1[i+1]=j+1;
        else
            next1[i+1]=0;
    }
}
void kmp(char* ss,char* s,int* next1,int n,int m)
{
    int ans=0;
    getnext(s,next1,m);
    int j=0;
    for(int i=0;i<n;i++)
    {
        while(j&&s[j]!=ss[i])
            j=next1[j];
        if(s[j]==ss[i])
            j++;
        if(j==m)
        {
           ans++;
           j=0;//注意复位!!!!
        }
    }
    printf("%d\n",ans);
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",wenben);
        scanf("%s",moban);
        int n=strlen(wenben);
        int m=strlen(moban);
        kmp(wenben,moban,next1,n,m);
    }
    return 0;
}

暴力:

#include<stdio.h>
#include<string.h>
using namespace std;
#define max_v 1005
char s1[max_v],s2[max_v];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",s1);
        scanf("%s",s2);
        int l1=strlen(s1);
        int l2=strlen(s2);
        int sum=0;
        int j=0;
        for(int i=0; i<l1; i++)
        {
            if(s1[i]==s2[j])
            {
                j++;
            }
            else
            {
                j=0;
            }
            if(j==l2)
            {
                sum++;
                j=0;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/yinbiao/p/9457438.html

时间: 2024-10-26 02:32:17

CSU 1598 最长公共前缀 (简单KMP或者暴力)的相关文章

最长公共前缀---简单

题目: 编写一个函数来查找字符串数组中的最长公共前缀.如果不存在公共前缀,返回空字符串 "". 示例: 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀. 思路: 先找出最小长度

【简单算法】20.最长公共前缀

题目: 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀. 说明: 所有输入只包含小写字

【leetcode 简单】第五题 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀. 说明: 所有输入只包含小写字母 a-

【leetcode算法-简单】14. 最长公共前缀

[题目描述] 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow","flight"]输出: "fl" 示例 2: 输入: ["dog","racecar","car"]输出: ""解释: 输入不存在公共前缀.说明: 所有输入只包含小写字母

LeetCode刷题-最长公共前缀(简单)

题目描述 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow","flight"]输出: "fl" 示例 2: 输入: ["dog","racecar","car"]输出: ""解释: 输入不存在公共前缀. 说明: 所有输入只包含小写字母 

leetcode——Longest Common Prefix 最长公共前缀(AC)

Write a function to find the longest common prefix string amongst an array of strings. 其实做起来会感觉很简单,需要注意的是要考虑效率的问题,毕竟可能是很长的字符串数组,所以可以考虑选取所有字符串中最短的那个来首先进行比较,因为最长公共子串肯定不会大于其长度,这样避免了字符串之间长度差异很大造成的效率损失,然后每次比较之后最长公共子串的长度也永远不会大于最短的那个字符串,只会不变或减小,只要遍历字符串数组,挨个

hdu 4691 最长公共前缀 后缀数组 +lcp+rmq

http://acm.hdu.edu.cn/showproblem.php?pid=4691 去年暑假多校赛的题,当时还不会后缀数组 现在会了,其实自己组合后缀数组跟rmq还是对的,但是题意理解有问题,于是折腾了很久,,,, 此处简单解释下题目样例吧,希望对读者有帮助  以最后一组数据为例 myxophytamyxopodnabnabbednabbingnabit 6 0 9 9 16 16 19 19 25 25 32 32 37 前两行不解释,题目叙述很清楚 从第三行,0 9 指的是第一个字

78 最长公共前缀

原题网址:https://www.lintcode.com/problem/longest-common-prefix/description 描述 给k个字符串,求出他们的最长公共前缀(LCP) 您在真实的面试中是否遇到过这个题?  是 样例 在 "ABCD" "ABEF" 和 "ACEF" 中,  LCP 为 "A" 在 "ABCDEFG", "ABCEFG", "ABCE

# Leetcode 14:Longest Common Prefix 最长公共前缀

公众号:爱写bug Write a function to find the longest common prefix string amongst an array of strings. If there is no common prefix, return an empty string "". 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". Example 1: Input: ["flower"