zoukankan      html  css  js  c++  java
  • bzoj1830: [AHOI2008]Y型项链(LCP+贪心)

    1830: [AHOI2008]Y型项链

    题目:传送门

    简要题意:

       给出三个字符串,可以对任意字符串进行操作,每次操作都可以再其中一个字符串的末尾删除或添加一个字符,求最小操作数使得所有的字符串相同

    题解:

       一开始没有看到只有三个串

       仔细想想发现会是一道水ti:

       因为只有三个串嘛,而且n才50,那就对任意两个串都跑一下LCP,找出匹配率最高的两个串,然后就可以开始真正的操作了:

       首先:对于匹配率最高的两个串,对串进行删除使它变短或者进行添加使它变长所需要的操作数是一样的(比如CATB和CATCHA)

       但是当对第三个串操作的时候影响是不同的:对于第三个串,要么什么都不用做,要么删了再加,要么直接加

       对于后面两种情况,肯定都只用在乎加了多少(那肯定越少越好),那么在前面对匹配率高的两个串进行操作时,肯定让它变短啦!

       nice双倍经验(没有搞懂AHOI的操作)

    代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cstdlib>
     4 #include<cmath>
     5 #include<algorithm>
     6 using namespace std;
     7 int len,len1,len2,len3,maxx,k;
     8 char s1[110],s2[110],s3[110];
     9 void get_LCP()
    10 {
    11     int i=1;maxx=0;k=0;
    12     while(s1[i]==s2[i] && i<=len1 && i<=len2)i++;
    13     if(maxx<i)maxx=i-1,k=3;
    14     i=1;
    15     while(s1[i]==s3[i] && i<=len1 && i<=len3)i++;
    16     if(maxx<i)maxx=i-1,k=4;
    17     i=1;
    18     while(s2[i]==s3[i] && i<=len2 && i<=len3)i++;
    19     if(maxx<i)maxx=i-1,k=5;
    20 }
    21 int main()
    22 {
    23     scanf("%d",&len1);scanf("%s",s1+1);
    24     scanf("%d",&len2);scanf("%s",s2+1);
    25     scanf("%d",&len3);scanf("%s",s3+1);
    26     get_LCP();
    27     if(k==3)
    28     {
    29         int ans=0;
    30         ans+=abs(len1-maxx)+abs(len2-maxx);int i=1;
    31         while(i<=maxx && s1[i]==s3[i])i++; 
    32         i--;
    33         ans+=(len3-i+maxx-i);
    34         printf("%d
    ",ans);
    35     }
    36     if(k==4)
    37     {
    38         int ans=0;
    39         ans+=abs(len1-maxx)+abs(len3-maxx);int i=1;
    40         while(i<=maxx && s1[i]==s2[i])i++; 
    41         i--;
    42         ans+=(len2-i+maxx-i);
    43         printf("%d
    ",ans);
    44     }
    45     if(k==5)
    46     {
    47         int ans=0;
    48         ans+=abs(len2-maxx)+abs(len3-maxx);int i=1;
    49         while(i<=maxx && s1[i]==s2[i])i++; 
    50         i--;
    51         ans+=(len1-i+maxx-i);
    52         printf("%d
    ",ans);
    53     }
    54     return 0;
    55 }
  • 相关阅读:
    Python魔法函数
    Python变量的本质与intern机制
    Python中IO概述
    自用官方文档索引(日常更新)
    关于 mysql json类型参数的查询过滤
    由于升级iOS版本导致证书丢失等一系列问题汇总
    Android系统获取手机型号和系统版本号,以及其他配置信息
    Android Debug证书过期的最佳解决方案
    关于编写高德导航Demo的手记(一)
    iOS6.0以上版本,关于NSDateFormatter的问题
  • 原文地址:https://www.cnblogs.com/CHerish_OI/p/8508619.html
Copyright © 2011-2022 走看看