博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3461 Oulipo KMP算法题解
阅读量:5864 次
发布时间:2019-06-19

本文共 1119 字,大约阅读时间需要 3 分钟。

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

就是所谓的Strstr函数啦。

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

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

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

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

#include 
#include
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;}

你可能感兴趣的文章
Hibernate前言介绍
查看>>
python 爬虫之爬取大街网(思路)
查看>>
mysql时间与日期函数
查看>>
hive学习5(复制表结构)
查看>>
在Win10 Anaconda中安装Tensorflow(转)
查看>>
WPF中使用MediaElement显示GIF
查看>>
安装pip和pylint
查看>>
ts 之 函数参数双向协变
查看>>
分布式session实现
查看>>
SQL Server Insert 操作效率(堆表 VS 聚集索引表)
查看>>
JS中的prototype、__proto__与constructor(图解)
查看>>
python用schedule模块实现定时任务
查看>>
java基础接口练习
查看>>
java 线程基本用法
查看>>
Log4j 配置
查看>>
正则表达式 反义
查看>>
将Tomcat注册为Windows服务
查看>>
LeetCode – Refresh – Maximum Depth of Binary Tree
查看>>
【JZOJ5915】明日之星
查看>>
ethereum/EIPs-191 Signed Data Standard
查看>>