【转】cf 825F - 19 String Compression 【kmp+dp】
2017-07-20 17:14
483 查看
@bin_gege
点击打开链接
题意:
给你一个长度为8000的字符串,让你压缩,输出压缩后的长度,
例如 ababcababc 压缩后 ab2c1ab2c1. 长度为10
aaaaaaaaaa 压缩后 a10 len=3
题解:
我是觉得字符串处理最小循环节是不好弄的,想用kmp又不会用,后来看了 @bin_gege 的blog
才知道kmp能这样用,
看来我还是对kmp理解太浅薄,,,
n^2的dp 每次更新压缩后长度为i的最小长度,
抄袭来的代码如下:
#include<bits/stdc++.h>
using namespace std;
void kmp_pre(char *x,int m,int *nxt){
int i,j;
j=nxt[0]=-1,i=0;
while(i<m){
while(-1!=j&&x[i]!=x[j])j=nxt[j];
nxt[++i]=++j;
}
}
const int N=10000;
int len,nxt
,dp
,cnt
;
char s
,buf[20],str
;
int main(){
scanf("%s",s);
len=strlen(s);
int t=1,q=10;
for(int i=1;i<=len;++i) {
if(i%q==0) t++,q*=10;
cnt[i]=t;
dp[i]=i+1;
}
for(int i=0;i<=len-1;++i){
strcpy(str,s+i);
kmp_pre(str,len-i,nxt);
for(int j=1;i+j<=len;j++){//枚举长度
int L=j-nxt[j];//以j结尾的子串的最小循环节
if(j%L==0){//如果这个子串的长度恰好能整除最小循环节,那么可以按照最小循环节压缩。
dp[i+j]=min(dp[i+j],dp[i]+L+cnt[j/L]);
}else dp[i+j]=min(dp[i+j],dp[i]+j+1);
}
}
printf("%d\n",dp[len]);
return 0;
}
点击打开链接
题意:
给你一个长度为8000的字符串,让你压缩,输出压缩后的长度,
例如 ababcababc 压缩后 ab2c1ab2c1. 长度为10
aaaaaaaaaa 压缩后 a10 len=3
题解:
我是觉得字符串处理最小循环节是不好弄的,想用kmp又不会用,后来看了 @bin_gege 的blog
才知道kmp能这样用,
看来我还是对kmp理解太浅薄,,,
n^2的dp 每次更新压缩后长度为i的最小长度,
抄袭来的代码如下:
#include<bits/stdc++.h>
using namespace std;
void kmp_pre(char *x,int m,int *nxt){
int i,j;
j=nxt[0]=-1,i=0;
while(i<m){
while(-1!=j&&x[i]!=x[j])j=nxt[j];
nxt[++i]=++j;
}
}
const int N=10000;
int len,nxt
,dp
,cnt
;
char s
,buf[20],str
;
int main(){
scanf("%s",s);
len=strlen(s);
int t=1,q=10;
for(int i=1;i<=len;++i) {
if(i%q==0) t++,q*=10;
cnt[i]=t;
dp[i]=i+1;
}
for(int i=0;i<=len-1;++i){
strcpy(str,s+i);
kmp_pre(str,len-i,nxt);
for(int j=1;i+j<=len;j++){//枚举长度
int L=j-nxt[j];//以j结尾的子串的最小循环节
if(j%L==0){//如果这个子串的长度恰好能整除最小循环节,那么可以按照最小循环节压缩。
dp[i+j]=min(dp[i+j],dp[i]+L+cnt[j/L]);
}else dp[i+j]=min(dp[i+j],dp[i]+j+1);
}
}
printf("%d\n",dp[len]);
return 0;
}
相关文章推荐
- CF825F:String Compression(dp & kmp)
- CF-19B - Checkout Assistant(DP)
- CF-19B - Checkout Assistant(DP)
- CF Educational Round 19 797 (F题DP+RMQ)以后补
- CF 462C. A Twisty Movement 思维,DP
- 玲珑杯 1100 萌萌哒的第五题 (KMP+DP)
- 【CF 731E】Funny Game(DP)
- [数位dp] cf 55D Beautiful numbers
- CF 467C - George and Job (简单区间DP)
- CF 256D. Good Sequences(DP)
- CF 581F 树形dp
- BZOJ.1009.[HNOI2008]GT考试(KMP DP 矩阵快速幂)
- CF 126B Password (KMP,利用next数组)
- CF#(4D)Mysterious Present(DP)
- CF 149D Coloring Brackets 彩色括号 区间DP
- DP细节,上下夹逼 cf-Summer Reading
- DP - CF 611D New Year and Ancient Prophecy
- 【DP】 TJU 4074 && CF 319C
- CF-13C. Sequence(DP)
- CF-25E - Test(KMP)