zoukankan      html  css  js  c++  java
  • [poj3461]Oulipo_KMP

    Oulipo poj-3461

        题目大意:给你两个字符串s和p,问s中有多少个等于p的子串。

        注释:$1le strlen(p)le 10^4qquad1le strlen(s)le 10^6$

          想法:刚刚学习KMP,先来一道裸题。什么是KMP?

          KMP是一种字符串匹配算法。如果求出在一个母串中子串出现的位置,我们用一种办法就是枚举母串中任意一个位置pos[i]作为子串开始节点,然后向后匹配,如果匹配成功或者失配,我们都必须重新从pos[i]+1开始重新枚举。我们假设已经匹配到了p串的j号字符,但是我们发现p串中的一些字符是不需要进行重新匹配的,我们就可以通过next数组来使得当前的j跳到next[j]来重新进行匹配,这样的算法,就是KMP(3个人名)。

            附上版子

          这是求next数组的版子

    void GetNext()
    {
    	int pLen=strlen(p);
    	int k=-1;
    	int j=0;
    	next[0]=-1;
    	while(j<pLen)
    	{
    		if(k==-1||p[j]==p[k])
    		{
    			++k;
    			++j;
    			next[j]=k;
    		}
    		else k=next[k];
    	}
    }
    

         然后我们一起看一下实现KMP的版子。

    void KmpSearch()
    {
    	int i=0;
    	int j=0;
    	int sLen=strlen(s);
    	int pLen=strlen(p);
    	while(i<sLen)
    	{
    		if(j==-1 || s[i] == p[j] ) i++ , j++;
    		else j=next[j];
    		if(j==pLen)
    		{
    			ans++,j=next[j];
    		}
    	}
    }
    

        最后,附上丑陋的代码... ...

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    char p[10010];
    char s[1001000];
    int next[10010];
    void GetNext()
    {
    	int pLen=strlen(p);
    	int k=-1;
    	int j=0;
    	next[0]=-1;
    	while(j<pLen)
    	{
    		if(k==-1||p[j]==p[k])
    		{
    			++k;
    			++j;
    			next[j]=k;
    		}
    		else k=next[k];
    	}
    }
    int ans=0;
    void KmpSearch()
    {
    	int i=0;
    	int j=0;
    	int sLen=strlen(s);
    	int pLen=strlen(p);
    	while(i<sLen)
    	{
    		if(j==-1 || s[i] == p[j] ) i++ , j++;
    		else j=next[j];
    		if(j==pLen)
    		{
    			ans++,j=next[j];
    		}
    	}
    }
    void original()
    {
    	memset(next,0,sizeof next);
    	ans=0;
    }
    int main()
    {
    	int cases;
    	scanf("%d",&cases);
    	while(cases--)
    	{
    		original();
    		scanf("%s%s",p,s);
    		GetNext();
    		KmpSearch();
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    

         小结:第一道KMP(好像大部分KMP的题都被我用hashShi过了)

  • 相关阅读:
    去除百度搜索结果中的广告的 js 代码
    js获取url参数
    奇淫技巧
    js生成hash序列
    Maven中可以被继承的POM元素
    多线程
    IO在Socket中的应用
    关于IO的整理
    finalize方法的使用
    复合赋值和简单复制的区别
  • 原文地址:https://www.cnblogs.com/ShuraK/p/8625830.html
Copyright © 2011-2022 走看看