大致题意:
求文本串中最多能选出多少子串,使得这些子串和模式串匹配。这里匹配的标准是,串中任意两个位置大小关系相同。
大致思路:
对每个位置i求出 0---i中多少个值大于小于等于str[i]并根据这些值去匹配
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int nMax=100002; int n,m,k; int ttt[nMax],ppp[nMax],sum1[nMax][30],low1[nMax],high1[nMax],sum2[nMax][30],low2[nMax],high2[nMax]; int lent,lenp,next[nMax]; int equal1(int pa,int tb){ int i; if(tb==pa){ if(high1[tb]==high2[pa]&&low1[tb]==low2[pa]&&sum1[tb][ttt[tb]]==sum2[pa][ppp[pa]])return 1; else return 0; }else{ int low=0,high=0,sum=sum1[tb][ttt[tb]]-sum1[tb-pa-1][ttt[tb]]; for(i=1;i<=k;i++){ if(i<ttt[tb]){ low+=sum1[tb-pa-1][i]; }else if(i>ttt[tb]){ high+=sum1[tb-pa-1][i]; } } if(low1[tb]-low==low2[pa]&&high1[tb]-high==high2[pa]&&sum==sum2[pa][ppp[pa]])return 1; else return 0; } } void get_next(){ int i,j=-1; next[0]=-1; for(i=1;i<=lenp;i++){ //pat[j]是不是可以理解为i的前一个字符的next值所指想的字符 while(j>-1&&ppp[j+1]!=ppp[i])j=next[j]; if(ppp[j+1]==ppp[i])j++; next[i]=j; } } int KMP(){ int ans=0,i=0,j=-1,last=-lenp-1; get_next(); for(i=0;i<lent;i++){ while(j!=-1&&!equal1(j+1,i)){//ppp[j+1]!=ttt[i] // cout<<j+1<<" edual1 "<<i<<endl; j=next[j]; } if(equal1(j+1,i)){ // cout<<j+1<<" edual1 "<<i<<endl; j=j+1; } if(j==lenp-1){ if(i-last>=lenp){ ans++; //找到一个匹配/ last=i; } } } return ans; } void init(){ lenp=m,lent=n; int i,j; memset(low1,0,sizeof(low1)); memset(low2,0,sizeof(low1)); memset(high1,0,sizeof(high1)); memset(high2,0,sizeof(high2)); memset(sum1,0,sizeof(sum1)); sum1[0][ttt[0]]=1; for(i=1;i<n;i++){ for(j=1;j<=k;j++){ sum1[i][j]=sum1[i-1][j]; if(j<ttt[i]){ low1[i]+=sum1[i][j]; }else if(j>ttt[i]){ high1[i]+=sum1[i][j]; } } sum1[i][ttt[i]]++; } memset(sum2,0,sizeof(sum2)); sum2[0][ppp[0]]=1; for(i=1;i<m;i++){ for(j=1;j<=k;j++){ sum2[i][j]=sum2[i-1][j]; if(j<ppp[i]){ low2[i]+=sum2[i][j]; }else if(j>ppp[i]){ high2[i]+=sum2[i][j]; } } sum2[i][ppp[i]]++; } } int main(){ int i,j; while(scanf("%d%d%d",&n,&m,&k)!=EOF){ for(i=0;i<n;i++)scanf("%d",&ttt[i]); for(i=0;i<m;i++)scanf("%d",&ppp[i]); init(); printf("%d\n",KMP()); } return 0; }
相关推荐
BF算法+KMP算法+马拉车算法C++实现
算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP
《KMP算法与通配符支持在字符串匹配中的应用》 KMP算法,全称Knuth-Morris-Pratt算法,是一种高效的字符串匹配算法,它由Donald Knuth、James H. Morris和 Vaughan Pratt三位学者于1977年提出。在计算机科学中,...
kmp算法 KMP算法是一种用于在一个文本串S中查找一个模式串P出现位置的高效算法。KMP算法的核心思想是利用模式串P本身的信息来避免在文本串S中进行不必要的匹配。具体来说,KMP算法通过预处理模式串P,构建一个部分...
kmp算法用C语言编写+最短路径ShortestPath_DIJ编码
【标题】"HDOJ.rar_HD_HDOJ" 是一个与HDU(杭州电子科技大学)在线判题系统HDOJ相关的压缩包文件,其中包含了大量编程题目的源代码。 【描述】提到,这个压缩包包含了几百道HDOJ题目的源代码,这意味着它是一个宝贵...
KMP算法,全称为Knuth-Morris-Pratt算法,是一种高效的字符串匹配算法,由Donald Knuth、Vaughan Morris和Robert Pratt三位学者提出。它的主要目标是在一个长字符串(主串A)中查找是否存在一个指定的短字符串(模式...
KMP(Knuth-Morris-Pratt)算法是一种在文本字符串中高效地查找子串的算法,由D.E. Knuth、V.R. Morris和J.H. Pratt在1970年代提出。这个算法避免了在匹配过程中频繁的回溯,极大地提高了查找效率。在给定的"KMP.rar...
kmp(kangle+mysql+php)集成版,支持asp、asp.net、php脚本环境,集成mysql数据库和phpmyadmin管理工具。kmp包含组件:kangle 2.1.8mysql-5.5.8php-5.2.17ZendOptimizer-3.3.9phpmyadmin-3.3.9
《OpenMP实现KMP并行串匹配》 在信息技术领域,字符串匹配算法是核心问题之一,广泛应用于文本处理、搜索引擎、生物信息学等多个领域。KMP(Knuth-Morris-Pratt)算法作为经典的字符串匹配算法,以其高效的性能受到...
### KMP算法详解与代码实现 #### 一、KMP算法概述 KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,由Donald Knuth、James H. Morris和Vaughan Pratt三位计算机科学家共同提出。相较于朴素的字符串匹配...
KMP算法实现 KMP算法实现 KMP算法实现 KMP算法实现
数据结构中KMP算法过程的Flash演示
《Python实现KMP算法:模糊文本字符串匹配》 在信息技术领域,字符串匹配是常见的操作,尤其是在文本处理、数据挖掘和搜索引擎优化中。其中,KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,它能有效地...
### 数据结果 KMP算法实验报告 #### 实验背景与目的 本实验主要针对《数据结构》课程中的字符串处理部分,具体涉及的是模式匹配算法——KMP算法。通过实验加深学生对串类型及其基本操作的理解,并重点掌握两种重要...
**KMP算法实现模板(C++版) ACM算法** KMP(Knuth-Morris-Pratt)算法是一种在文本字符串中查找子串匹配的有效方法,尤其适用于已经预处理了模式串(子串)的匹配信息。它是由D.E. Knuth、V. Morris和J.H. Pratt...
数据结构、kmp算法、代码实现、KMP(char *P,char *T,int *N,int start)
KMP算法,全名为Knuth-Morris-Pratt字符串匹配算法,是计算机科学中用于字符串搜索的一种高效的算法。KMP算法避免了在文本串中对模式串的不必要的回溯,提高了字符串匹配的效率,尤其在需要多次进行模式匹配时表现...
《36KMP算法详解与应用》 36KMP算法,全称为“Knuth-Morris-Pratt”算法,是一种在字符串中高效查找子串出现位置的算法,由D.E. Knuth、V. Morris和J.H. Pratt三位学者在1970年代提出。该算法的核心在于构造一个...
易语言KMP(Knuth-Morris-Pratt)算法模块是一个专门为易语言设计的文本处理工具,用于在字符串中高效地查找子串出现的位置。KMP算法是一种改进的字符串匹配算法,由Donald Knuth、Morris和Frank Pratt共同提出,其...