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 }
  • 相关阅读:
    MySQL常用维护管理工具 枫
    sql触发器 枫
    MySQL函数大全 枫
    使用Cscope阅读Linux源码 枫
    ASP.NET文件下载,直接向客户端输出文件 枫
    网站设计数据库集群和数据库垂直分割,水平分割,库表散列 枫
    西点成品分类 枫
    asp函数列表 枫
    [笔记]一道C语言面试题:实现 itoa() 函数
    [笔记]Arduino平台使用US100超声波测距模块的电平模式测距实验
  • 原文地址:https://www.cnblogs.com/CHerish_OI/p/8508619.html
Copyright © 2011-2022 走看看