对于数组s[0~n-1],计算next[0~n](多计算一位)。

考虑next[n],如果t=n-next[n],如果n%t==0,则t就是问题的解,否则解为1。

这样考虑:

比方字符串"abababab",

a  b a b a b a b *

next     -1 0 1 2 3 4 5 6  7

考虑这种模式匹配,将"abababab#"当做主串。"abababab*"当做模式串。于是进行匹配到n(n=8)时,出现了不匹配:

主串      abababab#

模式串   abababab*

于是模式串须要回溯到next[*]=7,这之前的主串和模式串相应相等,于是须要模式串向右滚动的位移是d=n-next[n]=2,即:

123456789

主串      abababab#

模式串       abababab*

于是能够看出,s[0~1]=s[3~4]=s[5~6]=s[7~8]。

所以位移d=n-next[n]能够看作是构成字符串s的字串(假设n%d==0,存在这种构成)。对应的反复次数也就是n/d。

  1. #include <iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. using namespace std;
  5. int len;
  6. int next[1000005];
  7. char s[1000005];
  8. int kmp_next()
  9. {
  10. int i=0,j=-1;
  11. next[0]=-1;
  12. while(i<len)
  13. {
  14. if(j==-1||s[i]==s[j])
  15. {
  16. i++;j++;
  17. next[i]=j;
  18.  
  19. }
  20. else
  21. j=next[j];
  22. }
  23. int x=i-next[i];//碰到不匹配的向前滚动的位移
  24. if(len%x==0)
  25. return x;
  26. else
  27. return len;
  28. }
  29.  
  30. int main()
  31. {
  32.  
  33. while(scanf("%s",s)!=EOF)
  34. {
  35. if(s[0]=='.')
  36. break;
  37. len=strlen(s);
  38. int ans=kmp_next();
  39. ans=len/ans;
  40. printf("%d\n",ans);
  41. }
  42. return 0;
  43. }

poj 2406 Power Strings KMP匹配的更多相关文章

  1. poj 2406 Power Strings (kmp 中 next 数组的应用||后缀数组)

    http://poj.org/problem?id=2406 Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submiss ...

  2. POJ 2406 Power Strings (KMP)

    Power Strings Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 29663Accepted: 12387 Descrip ...

  3. poj 2406 Power Strings kmp算法

    点击打开链接 Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 27368   Accepted:  ...

  4. poj 2406 Power Strings(KMP变形)

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 28102   Accepted: 11755 D ...

  5. POJ 2406 - Power Strings - [KMP求最小循环节]

    题目链接:http://poj.org/problem?id=2406 Time Limit: 3000MS Memory Limit: 65536K Description Given two st ...

  6. POJ 2406 Power Strings KMP求周期

    传送门 http://poj.org/problem?id=2406 题目就是求循环了几次. 记得如果每循环输出为1.... #include<cstdio> #include<cs ...

  7. POJ 2406 Power Strings KMP运用题解

    本题是计算一个字符串能完整分成多少一模一样的子字符串. 原来是使用KMP的next数组计算出来的,一直都认为是能够利用next数组的.可是自己想了非常久没能这么简洁地总结出来,也仅仅能查查他人代码才恍 ...

  8. POJ 2406 Power Strings KMP算法之next数组的应用

    题意:给一个字符串,求该串最多由多少个相同的子串相接而成. 思路:只要做过poj 1961之后,这道题就很简单了.poj 1961 详细题解传送门. 假设字符串的长度为len,如果 len % (le ...

  9. KMP POJ 2406 Power Strings

    题目传送门 /* 题意:一个串有字串重复n次产生,求最大的n KMP:nex[]的性质应用,感觉对nex加深了理解 */ /************************************** ...

随机推荐

  1. cocos2d-android 使用 cocos2d 绘图

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha cocos2d-android-1 https://github.com/ZhouWei ...

  2. 我的OI生涯 第一章

    第一章   一入电竞深似海 我叫WZY,是TSYZ的一名学生. 2016年7月10日,我进了一个叫做oi的坑. 那时的我不知道什么叫竞赛,不知道什么叫编程,不知道什么是c++. 就记得前一天我特意去图 ...

  3. SpringBoot返回结果如果为null或空值不显示处理方法

    第一种方法:自定义消息转换器 @Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter{ // /** // * ...

  4. ACM -- 算法小结(三)反转句子顺序与反转单词组成顺序

    hdoj 1321 反转句子字母顺序 ac 2011/10/05 #include <iostream> #include <string> #include <algo ...

  5. ExtJs2.0学习系列(12)--Ext.TreePanel之第一式

    今天开始,我们就开始一起学习TreePanel了,道个歉,上篇的代码很乱阿. 我总是喜欢用最简单的例子开始,去理解最基本的使用方法,减少对i后面高级使用的干扰! TreePanel是继承自Panel, ...

  6. char *p 与char p[]

    char *p=a和char*p=&a 前者p是一个指针变量后者p是一个char型变量 char *p = "123"; 为全局数组,放在常量区,而非普通数据段(静态存储区 ...

  7. TF卡翻盖式卡座

  8. 关于JAVA_HOME, CLASSPATH和PATH的设置

    http://bbs.csdn.net/topics/120079565 1.PATH,这个是给WINDOWS操作系统用的,告诉命令行里,执行的命令行工具在那里,比如java,javac这都是命令行工 ...

  9. p3p sso

    P3P是一种被称为个人隐私安全平台项目(the Platform for Privacy Preferences)的标准.能够保护在线隐私权,使Internet冲浪者能够选择在浏览网页时,是否被第三方 ...

  10. [转载] 无所不能的“蚂蚁”--Ant

    说他无所不能,好像有点夸张,但是用过Ant之后,感觉真的是只有想不到没有作不到.Ant,原作者选择他作为软件名字的意思是指"令一个简洁的工具"(Another Neat Tool) ...