kmp(二)

原创 2018年04月16日 15:49:41

Cyclic Nacklace HDU - 3746

题目链接:https://cn.vjudge.net/contest/163024#problem/D
题目大意:给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数。
例子:abcabc 已经循环2次,添加数为0
abcac 没有循环2次,添加字符abcac。数目为5.
abcabcab 已经循环过2次,但第三次不完整,需要添加数为1
题目分析:求循环节

      get_next();
      int min_repeat = len - Next[len - 1]; //最小循环节
      if(len % min_repeat == 0 && len / min_repeat > 1) //len / min_repeat 是为了防止一个字符的情况
      //if(len- (len - nexts[len]) > 0 && len%min_repeat==0) 也是对的
              printf("0\n");
      else
         printf("%d\n", min_repeat - (len % min_repeat));

为什么len - Next[len - 1]是最小循环节?
因为abcefgabc Next[len - 1] = 3,这是后缀与前缀的最大匹配个数,说明从abc又开始循环了,所以len - Next[len - 1]是循环节。
abcabcabcab 这种我也不懂怎么解释。
这里的循环节是说它应该的循环节,而不是说它真正的循环节。

Period HDU - 1358

题目链接:https://cn.vjudge.net/contest/163024#problem/E
题目大意:求字符串的前缀是否为周期串,若是,打印循环节的长度及循环次数;
题目分析:遍历每一个位置,判断循环节即可
例子:
3
aaa
Test case #1
2 2
3 3

12
aabaabaabaab
Test case #2
2 2
6 2
9 3
12 4

int main()
{
     int cas = 1, i;
     while(~scanf("%d", &len) && len)
     {
        scanf("%s", s);
        get_next();
        printf("Test case #%d\n", cas++);
        for(i = 1; i <= len; i++)
        {
            int min_repeat = i - Next[i - 1];
            if(i % min_repeat == 0 && i / min_repeat > 1)
                printf("%d %d\n", i, i / min_repeat);
        }

        printf("\n");
     }
     return 0;
}

Seek the Name, Seek the Fame POJ - 2752

题目链接:https://cn.vjudge.net/contest/163024#problem/H
题目分析:给定一个字符串s,从小到大输出s中既是前缀又是后缀的子串的长度。
例子: input :ababcababababcabab output: 2 4 9 18

int main()
{
    int i;
     while(~scanf("%s", s)) {
         len = strlen(s);
         get_next();

         int cnt = 0;
         int t = Next[len - 1];
         ans[cnt++] = len;
         while(t > 0) {
           if(s[len - 1] == s[t - 1]) {
              ans[cnt++] = t;
           }
           t = Next[t - 1];
       }
        for(i = cnt - 1; i >= 0; i--)
            printf("%d%c", ans[i], i == 0 ? '\n' : ' ');
     }
     return 0;
}

Count the string HDU - 3336

题目链接:https://cn.vjudge.net/contest/163024#problem/K
题目大意:给定一字符串,求该串的前缀在该串中的出现次数。
题目样例:
1
4
abab “a”出现l两次, “ab”出现两次, “aba”一次, “abab”一次 2+2+1+1 = 6
题目分析:
举个例子。
abababa**b**cab
00123456012
依旧是next数组的应用,首先每个前缀一定会出现一次,一共有n个。
当next[i] + 1 != next[i + 1] 时,就说明到这个位置,和前缀能匹配上,例子中b位置断开,Next[b] = 6,说明从当前位置向前六个跟前缀一样,就是说有六个前缀又出现了一次,这时候sum+= Next[b]。

int main()
{
    int t, n, i, sum;
    scanf("%d", &t);
    while(t--)  {
        scanf("%d", &n);
        scanf("%s", str);
        get_next();

        sum = n + Next[n - 1];
        sum %= 10007;
        for(i = 0; i < n - 1; i++) {
            if(Next[i] + 1 != Next[i + 1]) {
                sum += Next[i];
                sum %= 10007;
            }

        }

        printf("%d\n", sum % 10007);
    }
     return 0;
}

\KMP 伪代码\KMP 伪代码\KMP 伪代码

  • 2010年12月14日 13:02
  • 2KB
  • 下载

kmp算法实现

  • 2012年10月29日 16:47
  • 1KB
  • 下载

kmp 匹配算法

  • 2008年06月26日 00:27
  • 705B
  • 下载

STL中的find()函数,kmp的替代品

该函数在头文件zho
  • u013573047
  • u013573047
  • 2014-06-09 11:26:59
  • 1645

KMP模式匹配讲解和代码(代码可以直接使用)

  • 2011年08月28日 10:26
  • 906B
  • 下载

KMP与扩展KMP必须得过!!!

// first used normal KMP qiuxunhuanjie //then extend to do it KMP 扩展KMP未过,明日再看 #include using names...
  • Timsei
  • Timsei
  • 2017-05-24 15:31:20
  • 382

拓展kmp算法总结

算法总结第二弹,上次总结了下kmp,这次就来拓展kmp吧。 拓展kmp算法是对KMP算法的扩展,它解决如下问题: 定义母串S,和字串T,设S的长度为n,T的长度为m,求T与S的每一个后缀的最长公共前...
  • dyx404514
  • dyx404514
  • 2014-12-09 22:02:46
  • 9811

hdu__KMP算法模板题【持续更新中】

剪花布条                                                                           Time Limit: 1000/1000...
  • ACMore_Xiong
  • ACMore_Xiong
  • 2015-08-22 12:08:51
  • 3328

【哈希&KMP模板题】-POJ-3461-Oulipo

题目链接:http://poj.org/problem?id=3461 题目大意:
  • u013303743
  • u013303743
  • 2014-04-26 15:54:18
  • 1284

KMP算法实现原理

KMP算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,其对于任何模式和目标序列,都可以在线性时间内完成匹配查找,而不会发生退化,是一个非常优秀的模式匹配算法。...
  • caoyan_12727
  • caoyan_12727
  • 2016-09-16 16:27:22
  • 2461
收藏助手
不良信息举报
您举报文章:kmp(二)
举报原因:
原因补充:

(最多只允许输入30个字)