大致题意:
给出两个字符串,求出模式串pat在母串text中出现了多少次。
大致思路:
基础的KMP算法,要理解KMP的实现原理。(http://bbezxcy.iteye.com/blog/1355293 kmp算法详解)
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int nMax=10005;
const int mMax=1000005;
char text[mMax],pat[nMax];
int lent,lenp,next[nMax];
void get_next(){
int i,j=-1;
next[0]=-1;
for(i=1;i<=lenp;i++){ //pat[j]是不是可以理解为i的前一个字符的next值所指想的字符
while(j>-1&&pat[j+1]!=pat[i])j=next[j];
if(pat[j+1]==pat[i])j++;
next[i]=j;
}
}
int KMP(){
int ans=0,i=0,j=-1;
get_next();
for(i=0;i<lent;i++){
while(j!=-1&&pat[j+1]!=text[i]){
j=next[j];
}
if(pat[j+1]==text[i])j=j+1;
if(j==lenp-1)ans++; //找到一个匹配
}
return ans;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%s%s",pat,text);
lenp=strlen(pat);
lent=strlen(text);
printf("%d\n",KMP());
}
return 0;
}
本来打算用刚学的shift_and算法AC,却被狂wa。仔细思考后才明白,shift-and算法需要通过位运算来实现模式的匹配,对于每个字符都用一个长度等于该字符串长度的二进制数来记录模式串中这个字符的活动状态,所以模式串的长度不能超过int的32位,这里pos的长度最长可以达到10^4,显然不可以。先把wa的代码贴上来,留着模版说不好以后还能用上~~
#include <cstdio>
#include <cstring>
#include<iostream>
using namespace std;
int b[200];
char text[1000005];
char pat[10005];
void shiftAnd(){
int ans=0;
int lenP = strlen(pat);
int lenT=strlen(text);
memset(b,0,sizeof(b));
for(int i=0;i<lenP;++i){
b[pat[i]]|=1<<i;
}
int status = 0;
for(int i = 0;i<lenT; ++i){
status=((status<<1)|1)&b[text[i]];
if(status&(1<<(lenP -1))){
ans++;
}
}
printf("%d\n",ans);
}
int main(){
int cas;
cin>>cas;
while(cas--){
scanf("%s%s",pat,text);
shiftAnd();
}
return 0;
}
分享到:
相关推荐
- POJ 1961、POJ 2406:KMP算法的应用。 ### 其他问题 #### 贪心算法 - **题目示例**: - POJ 3411、POJ 1724:贪心策略的选择与应用。 #### 二分查找 - **题目示例**: - POJ 3373、POJ 1691:二分查找技术的...
《KMP算法在POJ题目中的应用》 KMP(Knuth-Morris-Pratt)算法,是一种在字符串中寻找子串的搜索算法,由Donald Knuth、Vaughan Pratt和James H. Morris三位学者于1970年代提出。在编程竞赛如POJ(Problemset On...
6. **KMP算法**: - (poj1961, poj2406):高效的字符串匹配算法。 ### 十、进阶状态压缩 1. **状态压缩技巧**: - 如何高效地表示和压缩状态。 2. **状态压缩优化**: - (poj3411, poj1724):进一步提高状态...
KMP算法的一个经典题题解,
kmp算法内容概况: 本文将介绍一种名为KMP的字符串匹配算法。KMP算法(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法,由Donald Knuth、Vaughan Pratt和James H. Morris共同发明。KMP算法通过使用一个称为...
D-KMP体系结构-官方样本这是D-KMP架构的官方示例,展示了一个适用于Android和iOS的简单主/详细应用程序。 有关D-KMP体系结构的更多信息,请阅读相关的。D-KMP体系结构的主要功能: 它使用最新的声明性UI工具包:适用...
* KMP 算法:例如 poj1961、poj2406。 4. 搜索: * 最优化剪枝和可行性剪枝。 * 搜索的技巧和优化:例如 poj3411、poj1724。 * 记忆化搜索:例如 poj3373、poj1691。 5. 动态规划: * 较为复杂的动态规划:...
kmp算法内容概况: 本文将介绍一种名为KMP的字符串匹配算法。KMP算法(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法,由Donald Knuth、Vaughan Pratt和James H. Morris共同发明。KMP算法通过使用一个称为...
《KMP-Expander:CSV格式的Mario Kart 7赛道编辑工具详解》 在电子游戏领域,特别是赛车游戏,Mario Kart 7凭借其丰富的赛道设计和竞技性深受玩家喜爱。为了满足玩家对自定义赛道的需求,开发人员和爱好者们创造了...
### ACM新手刷题攻略之POJ ... - 推荐题目:[poj1860](https://vjudge.net/problem/POJ-1860)、[poj3259](https://vjudge.net/problem/POJ-3259)、[poj1062](https://vjudge.net/problem/POJ-1062)、[poj2253]...
**热-KMP算法:字符串匹配的高效利器** KMP(Knuth-Morris-Pratt)算法是一种在文本中高效地查找子串出现位置的字符串匹配算法。由唐纳德·克努斯、维克托·莫里斯和弗兰克·普拉特在1970年提出。该算法避免了在...
KMP(Knuth-Morris-Pratt)算法是由D.E. Knuth、V. Morris和J.H. Pratt三位学者在1970年提出的一种高效的字符串匹配算法,它主要用于解决在一个大文本串中查找是否存在一个特定模式串的问题。KMP算法的效率在于它...
6. **KMP算法**(如poj1961, poj2406):高效的字符串匹配算法,适用于文本检索、模式识别等领域。 #### 优化技巧 1. **代码优化**(如poj3096, poj3007):包括循环展开、条件判断优化等,提高代码执行效率。 2. ...
KMP报告:元宇宙产品概念,哪一种消费者更有感 12.15-31页.pdf
- 字符串处理:如KMP算法和后缀数组,用于字符串搜索和模式匹配,如`poj1035, poj3080`。 - 排序算法:如快速排序和归并排序,用于对数据进行排序,如`poj2388, poj2299`。 - 并查集:用于处理集合的合并和查询...
D-KMP架构Daniele Baroncelli建议的D-KMP体系结构的试用示例,位于: ://danielebaroncelli.medium.com/the-future-of-apps-declarative-uis-with-kotlin-multiplatform-d-kmp-part-1 它:声明性UI(Jetpack编写)...
模板-kmp-库 Kotlin多平台库模板。 有一个针对多平台库的基线设置,该库支持除弃用的wasm32之外的所有kotlin。 特征 本机目标分组和共享sourceSet 包装程序库模块,它声明对所有lib模块的依赖关系 通过allprojects...
2. **POJ1790**:可能涉及字符串的模式匹配,如KMP算法或Boyer-Moore算法,用于在一个字符串中寻找另一个字符串的出现位置。 3. **POJ1951**:可能与字符串的排序有关,比如可以运用Manacher's Algorithm解决最长...
* KMP算法:POJ1961、POJ2406 * 左偏树(可合并堆) 四、搜索 * 最优化剪枝和可行性剪枝 * 较为复杂的动态规划:POJ1191、POJ1054、POJ3280、POJ2029、POJ2948、POJ1925、POJ3034 * 记录状态的动态规划:POJ3254、...
《KMP算法与Java实现详解》 在计算机科学中,字符串搜索算法是处理文本和数据的重要工具,其中KMP(Knuth-Morris-Pratt)算法因其高效性和实用性而备受青睐。KMP算法是由Donald Knuth、Vaughan Pratt和James H. ...