hdu1686 KMP水题

题意是给出文本串和模式串  玩模式串在文本串中出现多少次         把KMP稍稍改动下就ok了

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

char str1[10010],str[1000100];
int next[10010];
int deal(int len)
{
    next[0]=-1;
    int j=0;
    int k=-1;
    while(j<len-1)
    {
        if(k==-1||str1[k]==str1[j])
        {
            ++j;
            ++k;
            next[j]=k;
        }
        else k=next[k];
    }
    return 0;
}
int main()
{
    int T,i,j;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%s%s",str1,str);
        int len1=strlen(str1);
        int len2=strlen(str);
        deal(len1);
        i=j=0;
        int k=0;
        while(i<len2)
        {

            if(j==-1||str[i]==str1[j])
            {
                i++;
                j++;
            }
            else j=next[j];
            if(j==len1)
            {
                k++;
                i--;j--;
                j=next[j];

            }
        }
        printf("%d\n",k);
    }
    return 0;
}
时间: 2024-10-10 13:43:03

hdu1686 KMP水题的相关文章

hdu1686 KMP裸题

秋招快有着落啦,十一月中去北京区赛膜拜众神. 哎,好长一段时间没有刷过,重头拾起,最近得专题是字符串. Trie前一排又敲了一遍,KMP今天敲了一下. 题目一大堆废话,实际就是判断模式串出现得次数,我是对着算法导论伪代码敲得,一次AC,真得很水. /*********************************************************** > OS : Linux 3.13.0-24-generic (Mint-17) > Author : yaolong >

hdu2203 KMP水题

两种方法     第一种是纯粹KMP #include<stdio.h> #include<string.h> #include<iostream> using namespace std; char str1[200010],str2[100010]; int next[100010]; int get() { next[0]=-1; int j=0; int k=-1; int len=strlen(str2); while(j<len-1) { if(k==

[hdu2087]kmp水题

题意:求模板串在文本串中出现的次数(位置无交叉).只需在找到的时候把模板串指针归0即可. 1 #pragma comment(linker, "/STACK:10240000,10240000") 2 3 #include <iostream> 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstdlib> 7 #include <cstring> 8 #incl

[hdu2594]kmp水题

题意:求最长的a的前缀同时满足是b的后缀,把a,b连在一起,kmp跑一下,迭代next直到长度小于等于a,b长度的最小值为止,即为答案. 1 #pragma comment(linker, "/STACK:10240000,10240000") 2 3 #include <iostream> 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstdlib> 7 #include

hdu 2087 剪花布条 KMP水题。。

剪花布条 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10399    Accepted Submission(s): 6701 Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input 输入中含

Poj--3080Blue Jeans+KMP水题

题目链接:点击进入 大概的题意就是给n个字符串,然后让我们找出他们的最长的公共子串. 因为题目的数据比较小,我们可以枚举第一个串的所有子串,然后再用KMP判断一下这个子串是否出现在其它字符串中. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=100; ///x是模式串,m是长度,next是模式串对应的next数组 void k

hdu1711 Number Sequence(KMP水题)

题意: 在a串中寻找第一个包含b串的的位置 思路:直接KMP即可 #include <cstdio> #define MAXN 1000010 using namespace std; void kmp_pre(int x[],int m,int next[]){ int i,j; j=next[0]=-1; i=0; while(i<m){ while(-1!=j&&x[i]!=x[j]) j=next[j]; if(x[++i]==x[++j]) next[i]=ne

KMP水题

HUST 1010 The Minimum Length 题目传送:The Minimum Length AC代码: #include <map> #include <set> #include <cmath> #include <deque> #include <queue> #include <stack> #include <cstdio> #include <cctype> #include <s

刷了500道水题是什么体验?

并没有什么卵用. 我马上大二了,大一两学期目测切了1000道水题了,毫无意义. 至今不理解kmp和后缀数组,只会模板.数论和博弈论是什么?能吃吗?只会打表.图论至今不会tarjan,话说dlx是什么?插头dp,这是什么?数据结构还好,经常做高中生的题,可持久化可持久化线段树也能花一下午时间写出来,然而并不会考. 平时做题只刷水题,遇到难题的时候,随手搜题解,看了看,哇,这居然能这么搞!然后抄一遍别人代码,交上去ac. cf一年几乎没缺过,花了大一上半年时间才滚上div1.然而至今紫号一堆,黄名一