hdu1686 KMP

简单KMP 求单词出现的次数。直接可以考虑,在每一次匹配成功时,让ans++,k=next[k],直到结束。

#include<stdio.h>
#include<string.h>
#define maxn 1000010
#define ll 100010
int next[ll];
char s[maxn],p[ll];
void getnext()
{
    int j,k,len=strlen(p);
    j=0;
    k=-1;
    next[0]=-1;
    while(j<len)
    {
        if(k==-1||p[j]==p[k])
        {
            j++;
            k++;
            next[j]=k;
        }
        else
        {
            k=next[k];
        }
    }
}
void kmp()
{
    int i,k,len=strlen(s),ans=0;
    getnext();
    i=0;
    k=0;
    while(i<len)
    {
        if(k==-1||s[i]==p[k])
        {
            i++;
            k++;
        }
        else
        {
            k=next[k];
        }
        if(k==strlen(p))
        {
            ans++;//记录次数
            k=next[k];
        }
    }
    printf("%d\n",ans);
}
int main()
{
    int i,j,t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s %s",p,s);
        kmp();
    }
}
时间: 2024-12-24 18:48:26

hdu1686 KMP的相关文章

hdu1686 KMP裸题

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

HDU1686 KMP模板

仍旧是裸的字符串匹配可以拿来熟悉下字符串匹配问题,我是用来熟悉KMP的. #include<iostream> #include<cstring> #include<cstdio> using namespace std; const int N = 1e6+5; const int M = 1e4+5; char txt[N] , pat[M]; int pf[M]; void CPF() { pf[1] = 0; int k = 0; int len = strle

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<

hdu1686 KMP 求在字符串A中字符串B出现的次数

Oulipo Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 24592    Accepted Submission(s): 9516 Problem Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, wi

kmp模版题 hdu1686

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace std; 6 7 char s[1000010]; 8 char t[10010]; 9 int next1[10010]; 10 int m,n; 11 12 void getnext() 13 { 14 next1[0]=-1; 15 int i=0; 16 int j=-1; 17 while(i&l

kuangbin专题十六 KMP&amp;&amp;扩展KMP HDU1686 Oulipo

The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e'. He was a member of the Oulipo group. A quote from the book: Tout avait Pair normal, mais tout s’affirmait faux. Tout avait Fair normal, d’abord, pu

hdu2087剪花布条(KMP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 和hdu1686几乎一样,一点需要注意细节,已在代码中注明. 1 #include<cstdio> 2 #include<cstring> 3 char t[1001010],p[10100]; 4 int nex[10100]; 5 int tlen,plen; 6 int ans; 7 void getnex() 8 { 9 int j=0,k=-1; 10 nex[0]=-

洛谷 P3375 【模板】KMP字符串匹配 || HDU 1686 Oulipo || kmp

HDU-1686 P3375 kmp介绍: http://www.cnblogs.com/SYCstudio/p/7194315.html http://blog.chinaunix.net/uid-8735300-id-2017161.html(mp&kmp) http://www-igm.univ-mlv.fr/~lecroq/string/node8.html(mp&kmp,看上去很正确的例程) http://blog.csdn.net/joylnwang/article/detai

HDU1686 计算模式串匹配的次数

题目大意: 输入一个T,表示有T组测试数据: 每组测试数据包括一个字符串W,T,T长度大于W小于1000000,w长度小于10000,计算W匹配到T中成功的次数: 这题很明显要用KMP算法,不然很容易超时,但在使用kmp算法时也要注意,我第一次将匹配成功的位置得到后,循环进入kmp算法,从前一个匹配到的位置开始算起,但是超时了.后来问完学长之后,清楚了,没必要循环进入kmp,直接一次可以搞定,每次模式串匹配到末尾时,都将计数+1,然后根据next[m],重新得到j继续与原串进行匹配直到进行到原串