zoukankan      html  css  js  c++  java
  • kmp

    标准get_next(前缀函数)

    void init(int m)
    {
        memset(p, 0, sizeof(p));
        for(int i=1, k=0; i<m; i++)
        {
            while(k>0 && a[i]!=a[k]) k = p[k-1];
            if(a[i] == a[k]) k++;
            p[i] = k;
        }
    }
    

    get_next(有负一)

    int Next[maxn];
    void getnext(string s)
    {
        int len = s.size();
        int k = -1;
        Next[0] = k;
        for (int i = 1; i < len; i++)
        {
            while (k > -1 && s[k + 1] != s[i])
                k = Next[k];
            if (s[k + 1] == s[i])
                k++;
            Next[i] = k;
        }
    }
    

    kmp

    char a[maxn];
    char b[maxn];
    int ne[maxn];
    /*
    * ne[i]表示第0到i位的子串中 ,有长度为ne[i]的相同的前缀和后缀 
    * input:        DABCDABD 
    * output: next={00001231}
    */
    void get_next(char a[],char b[])
    {
    	int j=0;
    	int i=1;
    	int lena=strlen(a);
    	int lenb=strlen(b);
    	while (i<lenb)
    	{
    		if (b[i]==b[j])
    		{
    			ne[i]=j+1;
    			i++;
    			j++;
    		}
    		else
    		{
    			if (j!=0)
    			{
    				j=ne[j-1];//
    			}
    			else
    			{
    				ne[i]=0;
    				i++;
    			}			
    		}
    	}	
    } 
    void kmp(char a[],char b[],vector<int> &position)//vector传引用
    {
    	int j=0;
    	int i=0;
    	int lena=strlen(a);
    	int lenb=strlen(b);
    	while (i<lena)
    	{
    		if (a[i]==b[j])
    		{
    			i++;
    			j++;
    		}
    		else
    		{
    			if (j!=0)
    			{
    				j=ne[j-1];
    			}	
    			else
    			{
    				i++;
    			}
    		}
    		if (j==lenb)
    		{
    			position.push_back(i-j+1);
    //			printf("%d
    ",i-j+1);
    		}
    	}
    }
    
  • 相关阅读:
    JAVA程序员_常用英语
    Java基础常见英语词汇
    oracle sqlplus常用命令大全
    Ognl_JSTL_学习笔记
    DBA操作
    ssh面试题总结
    数据库面试笔试题集
    基本select 语句总结
    JSP面试知识
    featureCounts 软件说明
  • 原文地址:https://www.cnblogs.com/reshuffle/p/12726379.html
Copyright © 2011-2022 走看看