zoukankan      html  css  js  c++  java
  • hdu_5677_ztr loves substring(回文+二维多重背包)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5677

    题意:给你N个串,问能否选出小于K个回文字符串使得选出的字符串的长度之和为L。

    题解:很容易想到求一下回文字符串的个数和长度,然后就背包处理一下,数据比较水,用了manacher和二进制背包加速,0ms过。


     1 #include<cstdio>
     2 #include<cstring>
     3 #define min(a,b) (a)>(b)?(b):(a)
     4 const int maxn = 105;//字符串长度
     5 char s[105];
     6 int bk[101],t,n,k,l,val[10010],size[10010];
     7 bool dp[101][101];
     8 struct Manacher{
     9     char str[maxn<<1];
    10     int p[maxn<<1],len,mx,id,tl,ans,i;
    11     void maxlen(char *s){
    12         len=strlen(s),mx=0,id=0,tl=0,str[tl++]='$',str[tl++]='#';
    13         for(i=0;i<len;i++)str[tl++]=s[i],str[tl++]='#';
    14         for(i=2,str[tl]=0,ans=0;i<tl;i++){
    15             p[i]=mx>i?min(p[(id<<1)-i],mx-i):1;
    16             while(str[i-p[i]]==str[i+p[i]])p[i]++;
    17             if(i+p[i]>mx)mx=i+p[i],id=i;
    18             if(str[i]=='#'&&p[i]==1)continue;
    19                 bk[p[i]-1]++;
    20         }
    21     }
    22 }M;
    23 void back(){
    24     int cnt=0;//将所有的回文串二进制拆解
    25     for(int i=1;i<=100;i++){
    26         int tmp=1;
    27         while(bk[i]>=tmp)
    28             val[++cnt]=tmp*i,size[cnt]=tmp,bk[i]-=tmp,tmp*=2;
    29         if(bk[i])val[++cnt]=tmp*i,size[cnt]=tmp;
    30     }
    31     memset(dp,0,sizeof(dp));
    32     dp[0][0]=1;
    33     for(int i=1;i<=cnt;i++){
    34         for(int j=k;j>=size[i];j--)
    35             for(int r=l;r>=val[i];r--)
    36             if(dp[j-size[i]][r-val[i]])dp[j][r]=1;
    37     }
    38 }
    39 int main(){
    40     scanf("%d",&t);
    41     while(t--){
    42         scanf("%d%d%d",&n,&k,&l);
    43         memset(bk,0,sizeof(bk));
    44         for(int i=1;i<=n;i++){scanf("%s",s);M.maxlen(s);}
    45         back();
    46         if(dp[k][l])puts("True");
    47         else puts("False");
    48     }
    49     return 0;
    50 }
    View Code


  • 相关阅读:
    rabbitmq报错:not_a_dets_file,"/var/lib/rabbitmq/mnesia/rabbit@Sfabrici-Demo01/recovery.dets"的解决办法
    ubuntu18上关闭默认的防火墙
    《GCD宣言》全文
    springboot日志配置
    springboot打jar包【我】
    MongoDB 4.2 用户管理
    【短道速滑四】Halcon的texture_laws算子自我研究
    Android集合之SparseArray、ArrayMap详解
    浅析微信支付:下载对账单和资金账单
    学习如修行
  • 原文地址:https://www.cnblogs.com/bin-gege/p/5696176.html
Copyright © 2011-2022 走看看