Power Strings(kmp妙解)
Power Strings
Time Limit : 6000/3000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 29 Accepted Submission(s) : 14
描述:
对于数组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。
n-next[n]也就是当前最小匹配的字串长度。。。。。此处的next数组相当于代码中的p数组......
代码:
#include<stdio.h>
#include<string.h>
const int MAXN=;
int p[MAXN];
char s[MAXN];
int n,len;
void getp(){
int i=,j=-;
p[]=-;
while(i<len){
if(j==-||s[j]==s[i]){
i++;j++;
p[i]=j;
}
else j=p[j];
}
}
int main(){int answer;
while(scanf("%s",s),strcmp(s,".")){
memset(p,,sizeof(p));
len=strlen(s);
getp();
/*for(int i=0;i<=len;i++)printf("%d ",p[i]);
puts("");*/
answer=;
if(len%(len-p[len])==)answer=len/(len-p[len]);
printf("%d\n",answer);
}
return ;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
const int INF=0x3f3f3f3f;
const int MAXN=1000010;
int p[MAXN]; void getp(char* s){
int len=strlen(s);
int i=0,j=-1;
p[0]=-1;
while(i<len){
if(j==-1||s[i]==s[j]){
i++;j++;
p[i]=j;
}
else j=p[j];
}
} int main(){
char s[MAXN];
while(~scanf("%s",s),strcmp(s,".")){
getp(s);
int len=strlen(s);
if(len==0){
puts("0");continue;
}
if(p[len]!=-1&&len%(len-p[len])==0){
printf("%d\n",len/(len-p[len]));
}
else puts("1");
}
return 0;
}
下面是修正过的:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
typedef long long LL;
const int MAXN = ;
char s[MAXN];
int next[MAXN];
void getp(){
int i = , j = -;
next[i] = j;
while(s[i]){
if(j == - || s[i] == s[j]){
i++;j++;
next[i] = j;
if(s[i] == s[j])
next[i] = next[j];
}
else
j = next[j];
}
} int main(){
while(scanf("%s", s), s[] != '.'){
getp();
int len = strlen(s);
// for(int i = 0; i <= len; i++){
// printf("%d ", next[i]);}puts("");
if(len % (len - next[len]) == && len / (len - next[len]) > ){
printf("%d\n", len / (len - next[len]));
}
else puts("");
}
return ;
}
java写法:
import java.util.Scanner;
public class kmp{
public static class newkmp extends kmpmod{
public void work(char[] str){
getp(str);
//System.out.print(p[len]);
if(len % (len - p[len]) == )
System.out.println(len/(len - p[len]));
else
System.out.println();
}
}
public static char[] str = new char[];
public static void main(String[] argv){
Scanner cin = new Scanner(System.in);
newkmp kmp1 = new newkmp();
while(cin.hasNext()){
str = cin.next().toCharArray();
if(str.length == && str[] == '.')
break;
//System.out.print(str);
kmp1.work(str);
}
}
}
abstract class kmpmod{
protected int p[] = new int[];
protected int len;
public void getp(char[] str){
for(int i = ; i < p.length; i++){
p[i] = ;
}
len = str.length;
int i = , j = -;
p[] = -;
while (i < str.length) {
if(j == - || str[i] == str[j]){
i++; j++;
p[i] = j;
}
else{
j = p[j];
}
}
}
public abstract void work(char[] str);
}
Power Strings(kmp妙解)的更多相关文章
- 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: ...
- UVA - 10298 Power Strings (KMP求字符串循环节)
Description Problem D: Power Strings Given two strings a and b we define a*b to be their concatenati ...
- UVA10298 Power Strings [KMP]
题目传送门 Power Strings 格式难调,题面就不放了. 一句话题意,求给定的若干字符串的最短循环节循环次数. 输入样例#1: abcd aaaa ababab . 输出样例#1: 1 4 3 ...
- POJ2406 Power Strings —— KMP or 后缀数组 最小循环节
题目链接:https://vjudge.net/problem/POJ-2406 Power Strings Time Limit: 3000MS Memory Limit: 65536K Tot ...
- poj2406 Power Strings (kmp 求最小循环字串)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 47748 Accepted: 19902 ...
- 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: 3000MS Memory Limit: 65536K Total Submissions: 28102 Accepted: 11755 D ...
- POJ2406 Power Strings KMP算法
给你一个串s,如果能找到一个子串a,连接n次变成它,就把这个串称为power string,即a^n=s,求最大的n. 用KMP来想,如果存在的话,那么我每次f[i]的时候退的步数应该是一样多的 譬 ...
随机推荐
- Contains Duplicate II 解答
Question Given an array of integers and an integer k, find out whether there are two distinct indice ...
- Cuckoo hash算法分析
一 基本思想: cuckoo hash是一种解决hash冲突的方法,其目的是使用简单的hash 函数来提高hash table的利用率,同时保证O(1)的查询时间 基本思想是使用2个hash函数来处理 ...
- find -exec
find -exec 的标准写法 find ./ -name "*.tmp" -exec rm -rf "{}" \; find -exec 这个命令组合很好用 ...
- UGUI Text控件
学习UGUI的Text控件,用于显示文本!. 基本属性就不再啰嗦了! Alignment: 文字以 水平和垂直 对齐方式, Horizontal Overflow: 水平 Wrap: 文字大小和数量 ...
- kettle工具同步数据乱码-Linux下乱码问题二
将写好的kettle工程部署到Linux下后,同步的数据都成了乱码,幸运的是数据库有备份. 下面就说一下,kettle工程如何同步两端编码格式都是utf8的数据库. 我们只需要更改kettle数据库连 ...
- Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7932268 在前面一篇文章中,我们分析了And ...
- Git(一):Git与版本号控制简单介绍
Intro 版本号控制系统是什么 版本号控制系统(Version Control System,VCS)能够帮助我们记录和跟踪项目中各文件内容的改动变化.它能够帮我们保存项目的各个版本号.以 ...
- Vue.js快速入门
Vue.js介绍 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们 ...
- Head First C#(赛狗日)
实验背景: 人:Joe.Bob和AI希望参见赛狗赌博.最初,Joe有50元,Bob有75元,AI有45元.每次比赛前,他们都会各自决定是否下注以及所押的赌金.直到比赛前,他们都可以改变赌金,但是一旦比 ...
- NFS(网络文件系统的搭建)
关于NFS的原理,我在这就不概诉了,其实非常简答的理解就是一个网络磁盘,你需要把它挂载到你的磁盘上使用而已.那接下来谈谈如和搭建NFS网络文件系统. 需要使用2台机器作此实验,我分别配置IP为192. ...