codeforces 1003 F Abbreviation

http://www.elijahqi.win/archives/3930
题意:缩小一次之后最小的长度缩小为多少

那么我是直接暴力做的.. 考虑首先先把每个字符串变成数字 然后暴力枚举区间

然后贪心的看和这个区间相同的最多有多少个 那么 找出之后计算答案看能否更新即可

#include<bits/stdc++.h>
using namespace std;
const int N=330;
int n,s[N],id[N],cnt,ans;
map<string,int> mm;
int main(){
//  freopen("f.in","r",stdin);
    std::ios::sync_with_stdio(false);
    cin>>n;
    for (int i=1;i<=n;++i){
        string tmp;cin>>tmp;int idd=0;
        if(!mm[tmp]) mm[tmp]=idd=++cnt;else idd=mm[tmp];
        id[i]=idd;s[i]=s[i-1]+tmp.length();
    }ans=s[n]+n-1;
    for (int i=1;i<=n;++i){
        for (int j=i;j<=n;++j){
            int d=j-i,tot=0;
            for (int k=j+1;k+d<=n;++k){
                bool flag=1;
                for (int z=0;z<=d;++z)
                    if (id[i+z]!=id[k+z]){flag=0;break;}
                if (flag) ++tot,k+=d;
            }
            if(tot){
                int tmp=s[n]-(tot+1)*(s[j]-s[i-1])+tot+n;
                ans=min(ans,tmp);
            }
        }
    }printf("%d\n",ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值