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\n",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\n",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\n",ans);
53     }
54     return 0;
55 }

原文地址:https://www.cnblogs.com/CHerish_OI/p/8508619.html

时间: 2024-11-05 21:45:25

bzoj1830: [AHOI2008]Y型项链(LCP+贪心)的相关文章

bzoj 1789: [Ahoi2008]Necklace Y型项链 贪心

1789: [Ahoi2008]Necklace Y型项链 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1789 Description 欢乐岛上众多新奇的游乐项目让小可可他们玩的非常开心.现在他们正在玩比赛串项链的游戏,谁串的最快就能得到优厚的奖品.这可不是普通的项链,而是一种Y 型项链,项链的最中间有一颗大珍珠作为结合点,从大珍珠上连出来3条由各种宝

[BZOJ1789][BZOJ1830][Ahoi2008]Necklace Y型项链

试题描述 欢乐岛上众多新奇的游乐项目让小可可他们玩的非常开心.现在他们正在玩比赛串项链的游戏,谁串的最快就能得到优厚的奖品.这可不是普通的项链,而是一种Y型项链,项链的最中间有一颗大珍珠作为结合点,从大珍珠上连出来3条由各种宝石串起来的链子.比赛的规则是这样的:每次可以从三条链子中某一条的一端取下来一个宝石,或者安上去一个宝石,称为一次操作,经过若干次操作,最终使得三条链子完全相同.想要赢得比赛,那么只能使用尽量少的操作次数.假设每种宝石都有无数多个以供使用,且链子足够长.你能帮助小可可赢得比赛

1789: [Ahoi2008]Necklace Y型项链

1789: [Ahoi2008]Necklace Y型项链 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 421  Solved: 258[Submit][Status][Discuss] Description 欢乐岛上众多新奇的游乐项目让小可可他们玩的非常开心.现在他们正在玩比赛串项链的游戏,谁串的最快就能得到优厚的奖品.这可不是普通的项链,而是一种Y型项链,项链的最中间有一颗大珍珠作为结合点,从大珍珠上连出来3条由各种宝石串起来的链子.比赛的规

[BZOJ 1789] [BZOJ 1830] [AHOI 2008] Necklace Y型项链

1789 & 1830: [Ahoi2008]Necklace Y型项链 Time Limit: 1 SecMemory Limit: 64 MB Description 欢乐岛上众多新奇的游乐项目让小可可他们玩的非常开心.现在他们正在玩比赛串项链的游戏,谁串的最快就能得到优厚的奖品.这可不是普通的项链,而是一种Y型项链,项链的最中间有一颗大珍珠作为结合点,从大珍珠上连出来3条由各种宝石串起来的链子.比赛的规则是这样的:每次可以从三条链子中某一条的一端取下来一个宝石,或者安上去一个宝石,称为一次

bzoj1789 Necklace Y型项链

我们可以发现答案目标串即为某一个串的前缀,所以只要枚举前缀再计算两个串需要转移的距离即可 这种题目不要老往dp上想,要善于利用题目条件 1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 using namespace std; 6 string a,b,c; 7 string s; 8 int na,nb,nc; 9 int ans=1999123

hdu 4898 LCP+贪心思维

题意:将一个字符串切成k块,使得字典序最大的那块最小. ORZ  WJMZBMR,几行题解读了一天才懂. 快速比较两个子串的大小可以利用LCP(最长公共前缀),比较公共前缀的下一个字符的大小就够了. 利用这种思想,首先我们可以预处理所有子串的LCP(后缀数组+记录 O(2nlog(2n))+O(n*n),dp(O(4*n*n))) 然后将这些子串利用LCP按照字典序排序,开始二分答案. 二分的答案就是这K个块字典序的上限.假设以i作为起点,由于字典序上限已知,所以我们可以立刻求出i点最远能选到哪

X/Y型文案

[X/Y型文案] X型文案人,他们更像你语言学家.修辞学家和诗人,他们的日常工作就是想创意.查词典和构思修辞,以想办法用华丽的表达来描述产品. Y型文案往往并不华丽,有时甚至只不过是简单地描绘出用户心中的情景,它们往往充满画面感.语言简单.直指利益. 更多请参考链接中的原文. 转自:http://mt.sohu.com/20150602/n414301385.shtml

【bzoj3790】神奇项链——manacher+贪心

听说这道题可以用树状数组什么鬼的做,反正我不会,还是老老实实打manacher+贪心大法吧-- 我们只要在跑manacher的过程中,用一个结构体(也可以直接用数组)来记录以每个字符为对称轴的最长回文的最左端和最右端,然后就得到了一些线段,于是问题完美地转换成了求取最少段的线段来完全覆盖一个区间了,直接排完序后贪心一遍即可.当然这里面有些比较是不必要的,但我也懒得去优化了. 具体实现细节看代码: #include<cstdio> #include<cstring> #include

OI刷水记录

3.19 颓了一周: **3211: 花神游历各国 区间开方区间查询 可以用树状数组暴力修改+并查集维护下一个不为1的数 #include<bits/stdc++.h> #define rep(i,l,r) for(int i=l;i<=r;i++) #define N 101333 typedef long long ll; int f[N],a[N],now,m,n,l,r,x,delta; ll c[N]; inline void add(int x,int k){while(x&