poj 2046&&poj1961KMP 前缀数组
Power Strings
Time Limit: 3000 MS Memory Limit: 65536 KB
64-bit integer IO format: %I64d , %I64u Java class name: Main
Description
Input
Output
Sample Input
abcd
aaaa
ababab
.
Sample Output
1
4
3
题意:求解最多重复子串
利用KMP的前缀数组 以p为模式串 next【i】的意思 为前个字符组成的子串为s 则s的前next【i】个字符与后next【i】个字符相等
注意 : len(p)-next【len(p))】==循环节的长度
#include <iostream>
#include <stdio.h>
#include <string.h> using namespace std;
int next[];
char p[]; void find(char p[])
{
int m=strlen(p+);
next[]=;
for(int k=,q=; q<=m; q++)
{
while(k>&&p[k+]!=p[q])
k=next[k];
if(p[k+]==p[q])
k++;
next[q]=k;
}
} int main()
{ while(~scanf("%s",p+))
{
if(!strcmp(".",p+))
break;
find(p);
int len=strlen(p+);
int len1=len-next[len];
printf("%d\n",len%len1?:len/len1);
} }
Period
Time Limit: 3000 MS Memory Limit: 30000 KB
64-bit integer IO format: %I64d , %I64u Java class name: Main
Description
Input
number zero on it.
Output
consecutive test case number on a single line; then, for each prefix
with length i that has a period K > 1, output the prefix size i and
the period K separated by a single space; the prefix sizes must be in
increasing order. Print a blank line after each test case.
Sample Input
3
aaa
12
aabaabaabaab
0
Sample Output
Test case #1
2 2
3 3 Test case #2
2 2
6 2
9 3
12 4 题意: 定义字符串A,若A最多由n个相同字串s连接而成,则A=s^n,如"aaa" = "a"^3,"abab" = "ab"^2 "ababa" = "ababa"^1 给出一个字符串A,求该字符串的所有前缀中有多少个前缀SA= s^n(n>1) 输出符合条件的前缀长度及其对应的n
如aaa 前缀aa的长度为2,由2个'a'组成 前缀aaa的长度为3,由3个"a"组成
分析:KMP
若某一长度L的前缀符合上诉条件,则
1.next[L]!=0(next[L]=0时字串为原串,不符合条件)
2.L%(L-next[L])==0(此时字串的长度为L/next[L]) 对于2:有str[0]....str[next[L]-1]=str[L-next[L]-1]...str[L-1]
=》str[L-next[L]-1] = str[L-next[L]-1+L-next[L]-1] = str[2*(L-next[L]-1)];
假设S = L-next[L]-1;则有str[0]=str[s]=str[2*s]=str[3*s]...str[k*s],对于所有i%s==0,均有s[i]=s[0]
同理,str[1]=str[s+1]=str[2*s+1]....
str[j]=str[s+j]=str[2*s+j]....
综上,若L%S==0,则可得L为str[0]...str[s-1]的相同字串组成,
总长度为L,其中字串长度SL = s-0+1=L-next[L],循环次数为L/SL
故对于所有大于1的前缀,只要其符合上述条件,即为答案之一
#include "stdio.h"
int p[],N;
char str[]; void get_p(int n)
{
int i,j=-;
p[]=-;
for(i=;i<n;i++)
{
while(j>- && str[i]!=str[j+]) j=p[j];
if(str[i] == str[j+]) j++;
p[i]=j;
}
} int main()
{
int i,j,cas=;
while(scanf("%d",&N),N)
{
scanf("%s",str);
get_p(N);
printf("Test case #%d\n",cas++);
for(i=;i<N;i++)
{
if(p[i]!=- && (i+)%(i-p[i])==)
printf("%d %d\n",i+,(i+)/(i-p[i]));
}
printf("\n");
}
}
http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html 看一看
poj 2046&&poj1961KMP 前缀数组的更多相关文章
- poj 2566Bound Found(前缀和,尺取法)
http://poj.org/problem?id=2566: Bound Found Time Limit: 5000MS Memory Limit: 65536K Total Submissi ...
- codeforces 381 D Alyona and a tree(倍增)(前缀数组)
Alyona and a tree time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- 转载-KMP算法前缀数组优雅实现
转自:http://www.cnblogs.com/10jschen/archive/2012/08/21/2648451.html 我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见 ...
- 子串查询(二维前缀数组) 2018"百度之星"程序设计大赛 - 资格赛
子串查询 Time Limit: 3500/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Subm ...
- 线段树、前缀数组:HDU1591-Color the ball(区间更新、简单题)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- 前缀数组O(n^3)做法
前缀数组O(n^3)做法 s.substr()的应用非常方便 令string s = "; ); //只有一个数字5表示从下标为5开始一直到结尾:sub1 = "56789&quo ...
- POJ-2752(KMP算法+前缀数组的应用)
Seek the Name, Seek the Fame POJ-2752 本题使用的算法还是KMP 最主要的片段就是前缀数组pi的理解,这里要求解的纸盒pi[n-1]有关,但是还是需要使用一个循环来 ...
- poj 1961 Period 【KMP-next前缀数组的应用】
题目地址:http://poj.org/problem?id=1961 Sample Input 3 aaa 12 aabaabaabaab 0 Sample Output Test case #1 ...
- POJ 2406 KMP/后缀数组
题目链接:http://poj.org/problem?id=2406 题意:给定一个字符串,求由一个子串循环n次后可得到原串,输出n[即输出字符串的最大循环次数] 思路一:KMP求最小循环机,然后就 ...
随机推荐
- qt小程序
hello: #include <QApplication> #include <QLabel> int main(int argc, char *argv[]) { QApp ...
- MySQL5.7的安装(CentOS 7 & Ubuntu 16.04)
CentOS 通过 yum 安装MySQL5.7 Yum Repository 下载地址:https://dev.mysql.com/downloads/repo/yum/ 选择相应的版本进行下载:R ...
- DOM BOM 常用API小记
DOM 1.元素节点: 元素节点element: 更精确的获得元素的标签名(全大写) 属性节点attribute: 属性名 文本节点text: #text 注释节点document:#document ...
- openssl初步使用
centos平台 md5.c #include <stdio.h> #include <string.h> #include <stdlib.h> //#inclu ...
- 尝试解决nginx的499错误1
- Oracle 12c的可插拔数据库PDB
1. 默认安装之后会有一个可插拔数据库:pdborcl 2. 启动根容器: [oracle@eric ~]$ export ORACLE_SID=orcl [oracle@eric ~]$ sqlpl ...
- 扩展方法(深入理解c#)
1. 静态类到扩展方法: 许多方法可能都适合转为扩展方法,只要具有以下特征: 1)你想为一个类型添加一些成员: 2)你不需要为类型的实例添加更多的数据: 3)你不能改变类型本身,因为是别人的代码 2. ...
- 算法工程师B
美团点评2017校招笔试真题-算法工程师B 1.以下关于经典的k-means聚类的说法哪个是错误的? A:k-means聚类算法是全局收敛的 B:k-means的聚类结果和初始聚类中心点的选取有关 ...
- Tomcat架构解析(一)-----Tomcat总体架构
Tomcat是非常常用的应用服务器,了解Tomcat的总体架构以及实现细节,对于理解整个java web也是有非常大的帮助. 一.Server 1.最简单的服务器结构 最简单的服务器结构如图所示: ...
- 解决设置select默认选中不生效的方法
$scope.storageTypeList = ['Glusterfs','NFS','Ceph']; 不生效的方法: <select class="form-control&quo ...