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

[KMP]zoj 3587:Marlon's String

阅读更多

大致题意:
    给出一个模式串P和一个文本串T求存在多少种数字组合(a,b,c,d)使得Ta..b + Tc..d = P。

 

大致思路:
    可以用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];
long long a[nMax],b[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 flag){
    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++;  //找到一个匹配
        if(j!=-1){
            if(flag)a[j]++;
            else b[j]++;
        }
    }
    return ans;
}

int main(){
    int t,i,tmp;
    long long ans;
    scanf("%d",&t);
    while(t--){
        ans=0;
        scanf("%s%s",text,pat);
        lenp=strlen(pat);
        lent=strlen(text);
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        KMP(1);
        for(i=lenp;i!=-1;i--){
            if(next[i]!=-1) a[next[i]]+=a[i];
        }
        for(i=0;i<lent/2;i++){
            tmp=text[i];
            text[i]=text[lent-i-1];
            text[lent-i-1]=tmp;
        }
        for(i=0;i<lenp/2;i++){
            tmp=pat[i];
            pat[i]=pat[lenp-i-1];
            pat[lenp-i-1]=tmp;
        }
     //   cout<<pat<<" "<<text<<endl;
        KMP(0);
        for(i=lenp;i!=-1;i--){
            if(next[i]!=-1) b[next[i]]+=b[i];
        }
//        for(i=0;i<lenp;i++){
//            cout<<"a"<<a[i]<<" b"<<b[i]<<endl;
//        }
        for(i=0;i<lenp-1;i++){
            ans+=a[i]*b[lenp-i-2];
        }
        cout<<ans<<endl;
//        for(i=0;i<lenp;i++){
//            cout<<"a"<<a[i]<<endl;
//        }
    }
    return 0;
}
 

 

1
0
分享到:
评论
2 楼 暴风雪 2012-04-17  
ch2010091 写道

Orz
1 楼 ch2010091 2012-04-17  

相关推荐

    KMP.rar_KMP算法_java KMP_kmp string_kmp string tutorial_算法

    **KMP算法详解** KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,由D.E. Knuth、V.R. Morris和J.H. Pratt于1977年提出。它解决了在一个主串(文本串)中查找一个模式串(目标串)的问题,避免了在匹配...

    数据结构英文课件:Chap4 String.ppt

    寻找给定字符串s中的子串t的过程称为模式匹配,例如KMP算法、Boyer-Moore算法等,这些算法高效地解决了在大文本中查找特定模式的问题。 综上所述,数据结构中的字符串不仅涉及其定义和基本性质,还包括多种实现策略...

    c++ KMP 算法

    void KMP(std::string s, std::string p) { std::vector&lt;int&gt; lps = computeLPS(p); int m = s.size(), n = p.size(); int i = 0, j = 0; while (i ) { if (s[i] == p[j]) { i++; j++; } else { if (j &gt; 0)...

    KMP-suanfa.rar_kmp string

    print(kmp_search(s, p)) # 输出:0,表示"hello"在s中的起始位置 ``` 总结来说,KMP算法是一种高效、避免回溯的字符串匹配算法,它通过构建部分匹配表实现了对字符串匹配的优化,广泛应用于多种IT领域。理解和掌握...

    KMP算法:高效字符串匹配算法详解

    kmp算法内容概况: 本文将介绍一种名为KMP的字符串匹配算法。KMP算法(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法,由Donald Knuth、Vaughan Pratt和James H. Morris共同发明。KMP算法通过使用一个称为...

    D-KMP-sample:D-KMP官方样本

    D-KMP体系结构-官方样本这是D-KMP架构的官方示例,展示了一个适用于Android和iOS的简单主/详细应用程序。 有关D-KMP体系结构的更多信息,请阅读相关的。D-KMP体系结构的主要功能: 它使用最新的声明性UI工具包:适用...

    2.KMP算法:高效字符串匹配算法详解

    kmp算法内容概况: 本文将介绍一种名为KMP的字符串匹配算法。KMP算法(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法,由Donald Knuth、Vaughan Pratt和James H. Morris共同发明。KMP算法通过使用一个称为...

    kmpC语言实现 字符串匹配 算法

    在示例代码中,定义了两个字符串`s`和`t`,并调用`KMP(s, t)`函数进行匹配。程序输出了匹配的位置。例如,在这段代码中: ```c chars[] = "abababababababababc"; chart[] = "ababa"; printf("%d\n", KMP(s, t)); ``...

    KMP算法c语言实现

    void kmp_matcher(sstring s,sstring s1) { int i = 1,j=1; /* Number of characters mached */ int n = s.length; int m = s1.length; int *x = get_next (s1); while(i) { if(j==0 || s.p[i]==s1.p[j])...

    KMP-Expander:适用于CSV文件的Mario Kart 7的KMP编辑器

    《KMP-Expander:CSV格式的Mario Kart 7赛道编辑工具详解》 在电子游戏领域,特别是赛车游戏,Mario Kart 7凭借其丰富的赛道设计和竞技性深受玩家喜爱。为了满足玩家对自定义赛道的需求,开发人员和爱好者们创造了...

    完全掌握KMP算法思想

    int COUNT_KMP(const std::string &S, const std::string &T) { std::vector&lt;int&gt; next(T.size()); NEXT(T, next); int index = 0, count = 0; while (index &lt; S.size()) { int pos = 0; while (pos () && ...

    [VC++ 2010]一个封装有KMP模式匹配算法的String类示例

    在本文中,我们将深入探讨如何在C++编程环境中,特别是在Visual C++ 2010环境下,实现一个封装了KMP(Knuth-Morris-Pratt)模式匹配算法的自定义String类。KMP算法是一种高效的字符串搜索算法,能够处理模式串中存在...

    KMP算法实现的C++代码

    void KMP(const std::string& text, const std::string& pattern) { int n = text.size(), m = pattern.size(); const auto& pi = computePrefixFunction(pattern); int i = 0, j = 0; while (i ) { if (text[i...

    String实例

    String s(str.c_str()); return s; } ``` 以上就是手动构建`String`类及其相关成员函数的基本过程。通过这种方式,你可以根据实际需求定制自己的字符串类,以满足特定的性能和功能要求。不过需要注意的是,C++...

    热-KMP算法:字符串匹配的高效利器

    **热-KMP算法:字符串匹配的高效利器** KMP(Knuth-Morris-Pratt)算法是一种在文本中高效地查找子串出现位置的字符串匹配算法。由唐纳德·克努斯、维克托·莫里斯和弗兰克·普拉特在1970年提出。该算法避免了在...

    字符串的模式匹配算法——KMP

    bool KMP(const std::string& text, const std::string& pattern) { std::vector&lt;int&gt; prefix(pattern.size()); computePrefixFunction(prefix, pattern); int i = 0, j = 0; while (i () && j ()) { if (text...

    KMP_KMP_

    KMP(Knuth-Morris-Pratt)算法是由D.E. Knuth、V. Morris和J.H. Pratt三位学者在1970年提出的一种高效的字符串匹配算法,它主要用于解决在一个大文本串中查找是否存在一个特定模式串的问题。KMP算法的效率在于它...

    KMP算法实现,语言C++

    KMP(Knuth-Morris-Pratt)算法是一种在文本字符串中高效地查找子串的模式匹配算法。它由Donald Knuth、Vaughan Pratt和James H. Morris于1970年代提出,解决了在不进行回溯的情况下查找模式字符串在主字符串中出现...

    数据结果 kmp算法实验报告

    int Replace(String S, int start, String T, String V) { int pos = BFIndex(S, start, T); // 或者使用KMPIndex if (pos != -1) { Delete(S, pos, T.length); Insert(S, pos, V); return 1; } return 0; } ...

    kmp算法-基于Rust实现kmp算法.zip

    《深入理解KMP算法及其Rust实现》 KMP(Knuth-Morris-Pratt)算法是一种在文本中查找子串出现位置的高效算法,由Donald Knuth、James H. Morris和 Vaughan Pratt三位科学家共同提出。它避免了对已匹配部分的重复...

Global site tag (gtag.js) - Google Analytics