`
暴风雪
  • 浏览: 390638 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

[KMP+乱搞]hdoj 4749

 
阅读更多

大致题意:

     求文本串中最多能选出多少子串,使得这些子串和模式串匹配。这里匹配的标准是,串中任意两个位置大小关系相同。

 

大致思路:

      对每个位置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;
}

 

0
0
分享到:
评论

相关推荐

    字符串算法+BF算法+KMP算法+马拉车算法

    BF算法+KMP算法+马拉车算法C++实现

    KMP算法算法 KMP算法 KMP

    算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP

    KMP.rar_KMP_KMP 串匹配_KMP 支持通配符

    《KMP算法与通配符支持在字符串匹配中的应用》 KMP算法,全称Knuth-Morris-Pratt算法,是一种高效的字符串匹配算法,它由Donald Knuth、James H. Morris和 Vaughan Pratt三位学者于1977年提出。在计算机科学中,...

    HDOJ 1711 Number Sequence(KMP算法)可AC(C++版本)

    kmp算法 KMP算法是一种用于在一个文本串S中查找一个模式串P出现位置的高效算法。KMP算法的核心思想是利用模式串P本身的信息来避免在文本串S中进行不必要的匹配。具体来说,KMP算法通过预处理模式串P,构建一个部分...

    kmp算法用C语言编写+最短路径ShortestPath_DIJ编码

    kmp算法用C语言编写+最短路径ShortestPath_DIJ编码

    HDOJ.rar_HD_HDOJ

    【标题】"HDOJ.rar_HD_HDOJ" 是一个与HDU(杭州电子科技大学)在线判题系统HDOJ相关的压缩包文件,其中包含了大量编程题目的源代码。 【描述】提到,这个压缩包包含了几百道HDOJ题目的源代码,这意味着它是一个宝贵...

    KMP算法详解 KMP算法详解

    KMP算法,全称为Knuth-Morris-Pratt算法,是一种高效的字符串匹配算法,由Donald Knuth、Vaughan Morris和Robert Pratt三位学者提出。它的主要目标是在一个长字符串(主串A)中查找是否存在一个指定的短字符串(模式...

    kmp.rar_KMP

    KMP(Knuth-Morris-Pratt)算法是一种在文本字符串中高效地查找子串的算法,由D.E. Knuth、V.R. Morris和J.H. Pratt在1970年代提出。这个算法避免了在匹配过程中频繁的回溯,极大地提高了查找效率。在给定的"KMP.rar...

    kmp(kangle+mysql+php)集成版 v1.0

    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

    kmp.rar_KMP_kmp open_openmp_并行_并行串匹配

    《OpenMP实现KMP并行串匹配》 在信息技术领域,字符串匹配算法是核心问题之一,广泛应用于文本处理、搜索引擎、生物信息学等多个领域。KMP(Knuth-Morris-Pratt)算法作为经典的字符串匹配算法,以其高效的性能受到...

    KMP算法+全网最最最详细的代码注释,逐行注释,一看就懂,Code::Bclocks亲测完美运行!

    ### KMP算法详解与代码实现 #### 一、KMP算法概述 KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,由Donald Knuth、James H. Morris和Vaughan Pratt三位计算机科学家共同提出。相较于朴素的字符串匹配...

    kmp算法实现

    KMP算法实现 KMP算法实现 KMP算法实现 KMP算法实现

    KMP算法Flash演示

    数据结构中KMP算法过程的Flash演示

    kmp算法-基于Python+kmp算法实现模糊文本字符串匹配.zip

    《Python实现KMP算法:模糊文本字符串匹配》 在信息技术领域,字符串匹配是常见的操作,尤其是在文本处理、数据挖掘和搜索引擎优化中。其中,KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,它能有效地...

    数据结果 kmp算法实验报告

    ### 数据结果 KMP算法实验报告 #### 实验背景与目的 本实验主要针对《数据结构》课程中的字符串处理部分,具体涉及的是模式匹配算法——KMP算法。通过实验加深学生对串类型及其基本操作的理解,并重点掌握两种重要...

    KMP算法实现模板(c++版)ACM算法

    **KMP算法实现模板(C++版) ACM算法** KMP(Knuth-Morris-Pratt)算法是一种在文本字符串中查找子串匹配的有效方法,尤其适用于已经预处理了模式串(子串)的匹配信息。它是由D.E. Knuth、V. Morris和J.H. Pratt...

    kmp算法的代码实现

    数据结构、kmp算法、代码实现、KMP(char *P,char *T,int *N,int start)

    KMP算法c实现

    KMP算法,全名为Knuth-Morris-Pratt字符串匹配算法,是计算机科学中用于字符串搜索的一种高效的算法。KMP算法避免了在文本串中对模式串的不必要的回溯,提高了字符串匹配的效率,尤其在需要多次进行模式匹配时表现...

    36KMP算法.zip

    《36KMP算法详解与应用》 36KMP算法,全称为“Knuth-Morris-Pratt”算法,是一种在字符串中高效查找子串出现位置的算法,由D.E. Knuth、V. Morris和J.H. Pratt三位学者在1970年代提出。该算法的核心在于构造一个...

    易语言KMP算法模块

    易语言KMP(Knuth-Morris-Pratt)算法模块是一个专门为易语言设计的文本处理工具,用于在字符串中高效地查找子串出现的位置。KMP算法是一种改进的字符串匹配算法,由Donald Knuth、Morris和Frank Pratt共同提出,其...

Global site tag (gtag.js) - Google Analytics