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

就是所谓的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会在末尾保留'\n'
gets(text);//fgets(text, MAX_T, stdin);
wn = strlen(word);
tn = strlen(text);
genTbl();
printf("%d\n", getTimes());
}
return 0;
}

POJ 3461 Oulipo KMP算法题解的更多相关文章

  1. [POJ] 3461 Oulipo [KMP算法]

    Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23667   Accepted: 9492 Descripti ...

  2. POJ 3461 Oulipo KMP算法(模板)

    题意: 给两组字符串a和b,求a在b中出现的次数 关于KMP: 马拉车算法是处理回文串,而KMP是处理前后缀的相同字符串的最长长度. a | a | b | a | a | f | a | a 数组 ...

  3. POJ 3461 Oulipo KMP

    题意:统计其中一个子串的出现次数 题解:即KMP算法中j==m的次数 //作者:1085422276 #include <cstdio> #include <cmath> #i ...

  4. POJ 3080 Blue Jeans、POJ 3461 Oulipo——KMP应用

    题目:POJ3080 http://poj.org/problem?id=3080 题意:对于输入的文本串,输出最长的公共子串,如果长度相同,输出字典序最小的. 这题数据量很小,用暴力也是16ms,用 ...

  5. POJ 3461 Oulipo(KMP,模式串在主串中出现次数 可重叠)

    题意:给你两个字符串p和s,求出p在s中出现的次数. 显然,我们要先把模式串放到前面,之后主串放后面,中间隔开,这样就可以根据前缀数组的性质来求了. 我先想直接把p接到s前面,之后求Next数组对st ...

  6. HDU 1686 Oulipo / POJ 3461 Oulipo / SCU 2652 Oulipo (字符串匹配,KMP)

    HDU 1686 Oulipo / POJ 3461 Oulipo / SCU 2652 Oulipo (字符串匹配,KMP) Description The French author George ...

  7. POJ 3461 Oulipo(乌力波)

    POJ 3461 Oulipo(乌力波) Time Limit: 1000MS   Memory Limit: 65536K [Description] [题目描述] The French autho ...

  8. POJ 3461 Oulipo[附KMP算法详细流程讲解]

      E - Oulipo Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit ...

  9. POJ 3461 Oulipo(字符串匹配,KMP算法)

    题意:给出几组数据,每组有字符串W和T,问你W在T中出现几次. 思路:字符串长度很大,用KMP算法. 一开始写的是:调用KMP算法查找W在T中是否匹配,若匹配,则个数+1.则接下来T的索引移动相应的距 ...

随机推荐

  1. [ZJOI2012]旅游(树的直径)

    [ZJOI2012]旅游 题目描述 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个凸N边形来表示 ...

  2. BNU 34974 MATLAB大法好

    题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=34974 MATLAB大法好  Time Limit: 8000ms Memory Limi ...

  3. 使用Opencv2遇到error C2061: 语法错误: 标识符dest

    在写代码是遇到了这样一个问题,error C2061: 语法错误: 标识符"dest": 1>d:\opencv\opencv\build\include\opencv2\f ...

  4. Hadoop HDFS (4) Hadoop Archives

    用HDFS存储小文件是不经济的,由于每一个文件都存在一个block里,每一个block的metadata又在namenode的内存里存着,所以,大量的小文件.会吃掉大量的namenode的内存.(注意 ...

  5. linux(debian/ubuntu)下连接安卓手机--小米4为例

    更改:如今小米连接Ubuntu等Linux系统,直接改动手机上的连接方式就可以. --------------------------------------------- 因为安卓手机底层就是lin ...

  6. JavaWeb简单介绍

    服务器端编程 技术种类 Servlet JSP Struts Spring Hibernate EJB Web Service Web服务器 IIS Apache Tomcat (提供对JSP和Ser ...

  7. android CoordinatorLayout使用

    一.CoordinatorLayout有什么作用 CoordinatorLayout作为“super-powered FrameLayout”基本实现两个功能: 1.作为顶层布局 2.调度协调子布局 ...

  8. Controller接口控制器2

    5.ServletForwardingController 将接收到的请求转发到一个命名的servlet,具体示例如下: package cn.javass.chapter4.web.servlet; ...

  9. TYVJ 1935 拆点网络流

    思路: 就是一个多重匹配 把每个防御塔拆成 拆成第j次 发射的导弹 跑个网络流 //By SiriusRen #include <cmath> #include <queue> ...

  10. Windows平台下使用pthreads开发多线程应用

    pthreads简介 POSIX 1003.1-2001标准定义了编写多线程应用程序的API(应用程序编程接口),这个接口通常被称为pthreads.在常见的操作系统中,例如Unix.Linux.Ma ...