【转】cf 825F - 19 String Compression 【kmp+dp】


@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[N],dp[N],cnt[N];
char s[N],buf[20],str[N];

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值