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

[KMP]ural 1423:String Tale

阅读更多

大致题意:


     “abracadabra” > “aabracadabr” > “raabracadab” > “braabracada” > “abraabracad” > “dabraabraca” > “adabraabrac” > “cadabraabra” > “acadabraabr” > “racadabraab”。


大致思路:
    把第一个字符串复制一份接在自己后面,并将其作为文本串,把第二个字符串作为模式串,做一遍KMP求出模式串在文本串中出现的位置即可。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int nMax=250005;
const int mMax=2000005;
char text[mMax],pat[nMax];
int lent,lenp,nnext[nMax];

void get_nnext(){
    int i,j=-1;
    nnext[0]=-1;
    for(i=1;i<=lenp;i++){     //pat[j]是不是可以理解为i的前一个字符的nnext值所指想的字符
        while(j>-1&&pat[j+1]!=pat[i])j=nnext[j];
        if(pat[j+1]==pat[i])j++;
        nnext[i]=j;
    }
}

int KMP(){
    int ans=0,i=0,j=-1;
    get_nnext();
    for(i=0;i<lent;i++){
        while(j!=-1&&pat[j+1]!=text[i]){
            j=nnext[j];
        }
        if(pat[j+1]==text[i])j=j+1;
        if(j==lenp-1){
      //      cout<<"fuck "<<i<<endl;
            if(i==lenp-1)return 0;
            return lent-i-1;//ans++;  //找到一个匹配
        }
    }
    return -1;
}

int main(){
    int t;
    while(scanf("%d",&lenp)!=EOF){
        scanf("%s%s",text,pat);
        for(int i=0;i<lenp;i++){
            text[i+lenp]=text[i];
        }
        lent=2*lenp;
        text[lent]='\0';
        int ans=KMP();
        if(ans!=-1){
            printf("%d\n",ans);
        }
        else{
            printf("-1\n");
        }
    }
    return 0;
}
0
0
分享到:
评论

相关推荐

    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年提出。它解决了在一个主串(文本串)中查找一个模式串(目标串)的问题,避免了在匹配...

    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)...

    字符替换:简单的字符串替换程序,需要三个参数,原字符串,被替换的字符串,替换的字符串

    void replaceString(std::string& str, const std::string& from, const std::string& to) { size_t pos = 0; while ((pos = str.find(from, pos)) != std::string::npos) { str.replace(pos, from.length(), to)...

    KMP算法实现,语言C++

    bool kmpSearch(const std::string& text, const std::string& pattern, int* partialMatchTable) { int i = 0, j = 0; while (i () && j ()) { if (text[i] == pattern[j]) { i++; j++; } else if (j &gt; 0) { ...

    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实例

    最后,为了方便与其他类型的对象进行转换,我们可以提供`toStdString()`(返回std::string)和`fromStdString(const std::string&)`(从std::string创建String)函数: ```cpp std::string toStdString() const { ...

    字符串与或非判断类VC

    例如,如果我们有主字符串`str = "111aaa222bbbccc"`,我们可以使用`str.find("111")`来查找子字符串"111",如果找到则返回其在主字符串中的起始位置,否则返回`std::string::npos`。 接下来,我们涉及到了逻辑运算...

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

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

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

    1. **字符串数据存储**:可能使用C++的`std::string`,或者自定义字符数组来存储字符串数据。 2. **部分匹配表计算**:一个成员函数,如`buildPrefixFunction()`,用于计算模式串的前缀函数。 3. **KMP匹配**:一个...

    完全掌握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 ()) { int pos = 0; while (pos () && index ()) {...

    字符串的模式匹配算法——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...

    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算法通过使用一个称为...

    KMP.rar_pattern match

    void KMP(const std::string &text, const std::string &pattern) { std::vector&lt;int&gt; lps = computeLPS(pattern); int index = 0, textIndex = 0; while (textIndex ()) { if (pattern[index] == text[text...

    串匹配算法c++实现string matching algorithm

    void kmpMatch(const std::string& text, const std::string& pattern, std::vector&lt;int&gt;& result) { // 计算部分匹配表 int* lps = computeLPS(pattern); int i = 0, j = 0; while (i ()) { if (pattern[j] ...

    KMP.zip_C++_KMP

    int KMP(const std::string& text, const std::string& pattern) { std::vector&lt;int&gt; lps(pattern.size()); computeLPS(lps, pattern); int i = 0, j = 0; while (i () && j ()) { if (text[i] == pattern[j])...

    KMP.rar_visual c

    bool KMPMatch(const std::string &text, const std::string &pattern) { // ... 使用部分匹配表进行字符串匹配 } int main() { std::string text = "abcdefgahijk"; // 主串 std::string pattern = "abcgah"; /...

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

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

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

    text: String, partial_match_table: Vec, } impl KMP { fn build_table(pattern: &str) -&gt; Vec&lt;usize&gt; { // ... 构建部分匹配表的逻辑 ... } fn match_pattern(&self, text: &str) -&gt; Vec&lt;usize&gt; { // ......

    KMP.rar_H.R.H.

    void KMPMatch(const std::string &text, const std::string &pattern) { int prefixTable[pattern.size()]; computePrefixTable(pattern, prefixTable); for (int i = 0, j = 0; i (); ++i) { while (j &gt; 0 &&...

Global site tag (gtag.js) - Google Analytics