Power Strings

Time Limit : 6000/3000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 29   Accepted Submission(s) : 14
Problem Description
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).
 
Input
Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.
 
Output
For each s you should print the largest n such that s = a^n for some string a.
 
Sample Input
abcd aaaa ababab .
 
Sample Output
1 4 3
 
题解:让找串的重复度;

描述:

对于数组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妙解)的更多相关文章

  1. POJ 2406 Power Strings (KMP)

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

  2. poj 2406 Power Strings kmp算法

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

  3. UVA - 10298 Power Strings (KMP求字符串循环节)

    Description Problem D: Power Strings Given two strings a and b we define a*b to be their concatenati ...

  4. UVA10298 Power Strings [KMP]

    题目传送门 Power Strings 格式难调,题面就不放了. 一句话题意,求给定的若干字符串的最短循环节循环次数. 输入样例#1: abcd aaaa ababab . 输出样例#1: 1 4 3 ...

  5. POJ2406 Power Strings —— KMP or 后缀数组 最小循环节

    题目链接:https://vjudge.net/problem/POJ-2406 Power Strings Time Limit: 3000MS   Memory Limit: 65536K Tot ...

  6. poj2406 Power Strings (kmp 求最小循环字串)

    Power Strings   Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 47748   Accepted: 19902 ...

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

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

  8. poj 2406 Power Strings(KMP变形)

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

  9. POJ2406 Power Strings KMP算法

    给你一个串s,如果能找到一个子串a,连接n次变成它,就把这个串称为power string,即a^n=s,求最大的n. 用KMP来想,如果存在的话,那么我每次f[i]的时候退的步数应该是一样多的  譬 ...

随机推荐

  1. Php环境下载(PHPNow)安装

    下载 From http://servkit.org/download 安装 解压下载包,双击setup.cmd,按照提示执行安装. 安装成功测试 原来的解压目录

  2. UVA 11111-Generalized Matrioshkas(栈)

    题意:有很多层盒子,盒子里面再套盒子,一个盒子可能套多个独立的子盒子,但子盒子的总体积必须小于该盒子,否则不合法,输入给一行数,负数代表左边,正数代表右边,大小表示其体积,如-2,-1,1,2则表示体 ...

  3. ntp服务器池列表

    CentOS: 0.centos.pool.ntp.org 1.centos.pool.ntp.org 2.centos.pool.ntp.org 国内可用的 ntp.fudan.edu.cn 复旦 ...

  4. shell脚本书写总结

    1.shell脚本,如果重定向到文件中,则在脚本中不可以sed -i,如果用了sed -i ,则自打用了sed -i之后的打印都不能再重定向到输出文件了. 2.shell脚本中,如果将命令写在字符串里 ...

  5. GTID复制报错处理:Last_Error: Error 'Can't drop database 'test'; database doesn't exist' on query

    创建GTID主从连接: mysql, master_user; 报错显示: Slave_IO_Running: Yes Slave_SQL_Running: No Last_Error: Error ...

  6. Oracle官方版Entity Framework

    千呼萬喚始出來! Oracle官方版Entity Framework問市,邁入開發新時代 自從我得了一種"不用LINQ就不會寫資料庫程式"的病,為了滿足工作上要搭配Oracle(雖 ...

  7. ASP.NET通用权限组件思路设计

    开篇 做任何系统都离不开和绕不过权限的控制,尤其是B/S系统工作原理的特殊性使得权限控制起来更为繁琐,所以就在想是否可以利用IIS的工作原理,在IIS处理客户端请求的某个入口或出口通过判断URL来达到 ...

  8. C#创建Windows服务与安装-图解

    1.创建windows服务项目

  9. hadoop源码编译

    为何要自行编译hadoop源码,往往是由于官方提供的hadoop发行版都是基于32位操作系统,在操作hadoop时会发生warn.   准备软件: 1)JDK 2)Hadoop源码 3)Maven 4 ...

  10. BullseyeCoverage:代码覆盖率。

    1,安装和使用步骤 阅读READER文档.并安装(非常简单,README中有详细指令说明) 配置环境:同样可以阅读相关文档. 增加PATH环境变量.需要注意,此路径需要增加在PATH的最前列.即< ...