• POJ 3461 Oulipo KMP算法题解


    本题就是给出非常多对字符串,然后问一个字符串在另外一个字符串出现的次数。

    就是所谓的Strstr函数啦。

    Leetcode有这道差点儿一模一样的题目。

    使用KMP算法加速。算法高手必会的算法了。

    另外看见讨论说什么使用KMP还超时,最大可能是没有真正理解next table的含义,写了错误的代码,故此尽管自己执行结果正确,可是却没有真正发挥next table的作用。使得算法退化为暴力法了,所以执行正确,但超时。

    KMP參考: http://blog.csdn.net/kenden23/article/details/14178121

    #include <stdio.h>
    #include <string.h>
    
    const int MAX_N = 10001;
    const int MAX_T = 1000001;
    char word[MAX_N];
    char text[MAX_T];
    int nextTbl[MAX_N];
    int wn, tn;
    
    int getTimes()
    {
    	int ans = 0;
    	int i = 0, j = 0;	//i为text的当前下标,j为word的当前下标
    	for (; i-j <= tn-wn; i++)
    	{
    		if (text[i] == word[j])
    		{
    			j++;
    			if (j == wn)
    			{
    				ans++;
    				j = nextTbl[j-1];
    			}
    		}
    		else if (j > 0)
    		{
    			j = nextTbl[j-1];
    			i--;
    		}
    	}
    	return ans;
    }
    
    void genTbl()
    {
    	memset(nextTbl, 0, sizeof(int) * (wn));
    
    	int i = 1, j = 0;
    	while (i < wn)
    	{
    		if (word[i] == word[j]) nextTbl[i++] = ++j;
    		else if (j > 0) j = nextTbl[j-1];
    		else i++;
    	}
    }
    
    
    int main()
    {
    	int T;
    	scanf("%d", &T);
    	getchar();
    	while (T--)
    	{
    		gets(word);//fgets(word, MAX_N, stdin);//fgets会在末尾保留'
    '
    		gets(text);//fgets(text, MAX_T, stdin);
    		wn = strlen(word);
    		tn = strlen(text);
    		genTbl();
    		printf("%d
    ", getTimes());
    	}
    	return 0;
    }


  • 相关阅读:
    好用的QT连接
    c指针点滴-指针与类型
    c指针点滴5-指针变量计算
    c指针点滴4-指针的值
    c指针点滴三(指针运算)
    c语言指针点滴1
    c指针点滴2之比大小
    c指针点滴1
    linux安装redis
    支付宝支付接口流程
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7026978.html
Copyright © 2020-2023  润新知