poj 2406 Power Strings KMP匹配
对于数组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。
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int len;
int next[1000005];
char s[1000005];
int kmp_next()
{
int i=0,j=-1;
next[0]=-1;
while(i<len)
{
if(j==-1||s[i]==s[j])
{
i++;j++;
next[i]=j; }
else
j=next[j];
}
int x=i-next[i];//碰到不匹配的向前滚动的位移
if(len%x==0)
return x;
else
return len;
} int main()
{ while(scanf("%s",s)!=EOF)
{
if(s[0]=='.')
break;
len=strlen(s);
int ans=kmp_next();
ans=len/ans;
printf("%d\n",ans);
}
return 0;
}
poj 2406 Power Strings KMP匹配的更多相关文章
- poj 2406 Power Strings (kmp 中 next 数组的应用||后缀数组)
http://poj.org/problem?id=2406 Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submiss ...
- POJ 2406 Power Strings (KMP)
Power Strings Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 29663Accepted: 12387 Descrip ...
- poj 2406 Power Strings kmp算法
点击打开链接 Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 27368 Accepted: ...
- poj 2406 Power Strings(KMP变形)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 28102 Accepted: 11755 D ...
- POJ 2406 - Power Strings - [KMP求最小循环节]
题目链接:http://poj.org/problem?id=2406 Time Limit: 3000MS Memory Limit: 65536K Description Given two st ...
- POJ 2406 Power Strings KMP求周期
传送门 http://poj.org/problem?id=2406 题目就是求循环了几次. 记得如果每循环输出为1.... #include<cstdio> #include<cs ...
- POJ 2406 Power Strings KMP运用题解
本题是计算一个字符串能完整分成多少一模一样的子字符串. 原来是使用KMP的next数组计算出来的,一直都认为是能够利用next数组的.可是自己想了非常久没能这么简洁地总结出来,也仅仅能查查他人代码才恍 ...
- POJ 2406 Power Strings KMP算法之next数组的应用
题意:给一个字符串,求该串最多由多少个相同的子串相接而成. 思路:只要做过poj 1961之后,这道题就很简单了.poj 1961 详细题解传送门. 假设字符串的长度为len,如果 len % (le ...
- KMP POJ 2406 Power Strings
题目传送门 /* 题意:一个串有字串重复n次产生,求最大的n KMP:nex[]的性质应用,感觉对nex加深了理解 */ /************************************** ...
随机推荐
- Eigen学习笔记1:在VS2015下Eigen(矩阵变换)的配置
一.Eigen简介 Eigen是一个高层次的C ++库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法. Eigen适用范围广,支持包括固定大小.任意大小的所有矩阵操作,甚至是稀疏矩阵:支持 ...
- 【二项式定理】【DFS】UVALive - 7639 - Extreme XOR Sum
题意:一个序列,q次询问,每次问你某个指定区间内的EXtreme XOR值. 一个长度为l的区间的EXtreme XOR值被定义为,从左到右,将每相邻的两个数XOR起来,产生l-1个新的值,……如此循 ...
- 【带修改的主席树】BZOJ1901-Dynamic Rankings
稍后整理笔记.这题数据范围好像有点问题? #include<iostream> #include<cstdio> #include<cstring> #includ ...
- DropdownList 赋初始值问题
网上查了这样的代码 虽然是可以用.但是会点击多次会出现”“ dropdownList不能选多个值的问题“ private void initdroplistitemlirun(string c_Bus ...
- 一些WPF中的滤镜特效——Effect Library
WPF支持类似PhotoShop的滤镜功能,称之为Effect.在.Net 4.0中,WPF就废弃了对BitMapEffect的支持,转向使用支持GPU加速的Effect类,例如,我们可以使用如下代码 ...
- mysql -h localhost和mysql -h 127.0.0.1的区别
今天早上同事说MySQL root账号登录不上了.我试了一下 #mysql -u root -p 提示”Access denied for user ‘root’@’localhost’ (using ...
- 对printf函数的理解1
看如下代码: #include <stdio.h> int main(int argc, const char *argv[]) { printf("%s\n",&qu ...
- Introducing ASP.NET Core: The New ASP.NET in Town!
The new version of ASP.NET is called ASP.NET Core (a.k.a ASP.NET 5) and it has the most significant ...
- MySQL Cluster(MySQL 集群) 初试
MySQL Cluster 是MySQL适合于分布式计算环境的高实用.高冗余版本.它采用了NDB Cluster 存储引擎,允许在1个 Cluster 中运行多个MySQL服务器.在MyQL 5.0及 ...
- android NDK编程:使用posix多线程与mutex相互排斥同步
MainActivity.java 调用原生方法 posixThreads(int threads, int iterations) 启动线程 package com.apress.threads; ...