codeforces 825F F. String Compression dp+kmp找字符串的最小循环节
/**
题目:F. String Compression
链接:http://codeforces.com/problemset/problem/825/F
题意:压缩字符串后求最小长度。
思路:
dp[i]表示前i个字符需要的最小次数。
dp[i] = min(dp[j]+w(j+1,i)); (0<=j<i); [j+1,i]如果存在循环节(自身不算),那么取最小的循环节x。w = digit((i-j)/x)+x;
否则w = i-j+1; 求一个区间最小循环节:
证明:http://www.cnblogs.com/chenxiwenruo/p/3546457.html
KMP最小循环节、循环周期: 定理:假设S的长度为len,则S存在最小循环节,循环节的长度L为len-next[len],子串为S[0…len-next[len]-1]。 如果next[len]==0,T = len/L = 1; 说明自身就是循环节。周期为1. (1)如果len%(len - next[len])==0,则表明字符串S可以完全由循环节循环组成,循环周期T=len/L。(这里的len就是从0开始的len位置,kmp也计算了next[len]。) (2)如果不能,说明还需要再添加几个字母才能补全。需要补的个数是循环个数L-len%L=L-(len-L)%L=L-next[len]%L,L=len-next[len]。
*/ #include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <queue>
#include <iostream>
#include <vector>
using namespace std;
#define ms(x,y) memset(x,y,sizeof x)
const int N = 8e3 + ;
const int INF = 0x3f3f3f3f;
char s[N];
int f[N];
int dp[N];
int w[N][N];///w[i][j]表示[i,j]字符串的价值。
int digit(int x)
{
int cnt = ;
while(x){
cnt++;
x /= ;
}
return cnt;
}
void getFail(char *p,int* f)
{
int m = strlen(p);
f[] = f[] = ;
for(int i = ; i < m; i++){
int j = f[i];
while(j&&p[i]!=p[j]) j = f[j];
f[i+] = (p[i]==p[j])?j+:;
}
}
void solve(char *s)
{
int n = strlen(s);
for(int i = ; i < n; i++) w[i][i] = ;
for(int i = ; i < n; i++){
getFail(s+i,f);
for(int j = i+; j <= n; j++){
int len = j-i;
int d = len-f[j-i];
if(f[j-i]==||len%d!=){
w[i][j-] = len+;
}else
{
w[i][j-] = digit(len/d)+d;
}
}
}
}
int main()
{
while(scanf("%s",s)==)
{
solve(s);
int n = strlen(s);
dp[] = w[][];
for(int i = ; i < n; i++){
dp[i] = w[][i];///整段[0,i]。
for(int j = ; j < i; j++){
dp[i] = min(dp[i],dp[j]+w[j+][i]);
}
}
printf("%d\n",dp[n-]);
} return ;
}
codeforces 825F F. String Compression dp+kmp找字符串的最小循环节的更多相关文章
- poj1961 Period kmp解决找字符串的最小循环节
/** 题目:poj1961 Period 链接:http://poj.org/problem?id=1961 题意:求从1到i这个前缀(2<=i<=N) ,如果有循环节(不能自身单独一个 ...
- kmp的next数组的运用(求字符串的最小循环节)
hdu3746 Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- POJ2406 Power Strings —— KMP or 后缀数组 最小循环节
题目链接:https://vjudge.net/problem/POJ-2406 Power Strings Time Limit: 3000MS Memory Limit: 65536K Tot ...
- Codeforces Round #146 (Div. 1) C - Cyclical Quest 后缀自动机+最小循环节
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk mak ...
- Cyclic Nacklace hdu3746 kmp 最小循环节
题意:给出一段字符串 求最少在最右边补上多少个字符使得形成循环串(单个字符不是循环串) 自己乱搞居然搞出来了... 想法是: 如果nex[len]为0 那么答案显然是补len 否则 答案为循环 ...
- Common Divisors CodeForces - 182D || kmp最小循环节
Common Divisors CodeForces - 182D 思路:用kmp求next数组的方法求出两个字符串的最小循环节长度(http://blog.csdn.net/acraz/articl ...
- 【KMP+最小循环节】F. Cyclic Nacklace
https://www.bnuoj.com/v3/contest_show.php?cid=9147#problem/F [题意] 给定一个字符串,问在字符串后最少添加多少个字母,得到的新字符串能是前 ...
- Codeforces Round #117 (Div. 2) D.Common Divisors(KMP最小循环节)
http://codeforces.com/problemset/problem/182/D 题意:如果把字符串a重复m次可以得到字符串b,那么我们称字符串a为字符串b的一个因子,现在给定两个字符串S ...
- HDU1358 Period —— KMP 最小循环节
题目链接:https://vjudge.net/problem/HDU-1358 Period Time Limit: 2000/1000 MS (Java/Others) Memory Lim ...
随机推荐
- 【云计算】Docker build解决父镜像层级关系过多问题:Cannot create container with more than 127 parents
docker export 8a6e92c71a77 > malakas.tzr.gz cat malakas.tzr.gz|docker import - /nscloud/malakas:1 ...
- 【转】dependency injection 的例子
Dependency Injection in PHP. Create your own DI container. / blog / PHP By my opinion one of the big ...
- PHP图像操作:3D图、缩放、旋转、裁剪、加入水印(一)
来源:http://www.ido321.com/875.html 1.利用php gd库的函数绘制3D扇形统计图 1: <?php 2: header("content-type&q ...
- 流媒体播放mime类型添加
.m3u8 application/x-mpegURL.ts video/MP2T
- C/C++中传值和传地址(引用)
C/C++中参数传递有两种方式,传值或传地址(传引用),通常我们要在被调用函数中改变一个变量的值就需要传地址调用方式,例如: void swap_by_value(int a, int b) { in ...
- 伪分布模式安装hadoop
准备工具: 虚拟机:VMware Linux系统:CentOS hadoop-1.1.2.tar.gz jdk-7u75-linux-x64.gz CentOS的网络配置 1.设置主机中VMware ...
- php中的重载以及几个常用的魔术方法示例
在面向对象语言中,有一个很重要的概念——overload,即重载.所谓重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同.但是,在php中,这个概念跟大多面向对象语言中的“ ...
- css3 使用animation实现动画效果
.rotation { -webkit-animation-name: rotation; -webkit-animation-duration: 30s; -moz-animation-name: ...
- Android中的UriMatcher、ContentUrist和ContentResolver
因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从Uri中获取数据.Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris .掌握它们的 ...
- oracle 复杂的查找用法
[第一题]: 找到员工表中工资最高的前三名,要求按如下格式输出(第一步部分):以及oracle查询结果指定分页显示的方法(第二部分). ——涉及Top-N分析问题. 一般不在子查询中使用order b ...