1830 、 1789 双倍经验 : [AHOI2008]Y型项链

1789: [Ahoi2008]Necklace Y型项链

Description

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

Input

一共有3行,表示Y型项链的三条链子,每行开始有一个数字N,表示初始时这条链子上串有N个宝石(N<=50),随后是一个空格,然后是N个'A'和'Z'之间的字符,表示这个链子上的宝石,每个字母表示一种不同的宝石,这个字符串最左边的字符表示的是离大珍珠最近的那个宝石,而最右边的表示的是在链子末端的宝石。

Output

只有一个整数,表示所需要的最少的操作次数.

Sample Input

3 CAT
3 TAC
5 CATCH

Sample Output

8


HINT

提示:100%的数据中,N<=50.
50%的数据中,N<=20.

思路 :

  考虑先把两个串弄成一样的, 这样就是把两个串LCP留下,后面的删掉或者补出其他的, 对于第三个串, 显然前两个串尽可能的少不会出现更差的解,故把两个有最长LCP的切到只剩LCP, 另外一个切到自己和另两个之一(因为另两个的长, 其实就是三个剩余串的LCP) 的LCP, 再把少的部分补上, 水题, 看代码更明白。

 

#include <cstdio>
#include <algorithm>
using namespace std;
char s[4][60]; int len[4]; int lcp[4][4]; 
int mxn, mi, x1, x2; 
int calc(int x, int y) {
    int lim = min(len[x], len[y]); 
    for(int i=0;i<lim;i++) {
        if(s[x][i]!=s[y][i]) 
            return i; 
    } 
    return lim; 
} 
int main() {
    for(int i=1;i<=3;i++) {
        scanf("%d%s", &len[i], s[i]); 
    } 
    x1=1,x2=2,mi=3; 
    for(int i=1;i<=3;i++) {
        for(int j=i+1;j<=3;j++) {
            lcp[i][j] = lcp[j][i] = calc(i, j); 
            if(lcp[i][j]>mxn) mxn=lcp[i][j], mi = 6-i-j, x1=i,x2=j; 
        } 
    } 
    int ans = 0; 
    ans += len[x1]+len[x2]-lcp[x1][x2]*2; 
    len[x1] = len[x2] = lcp[x1][x2]; 
    ans+=len[mi]+len[x1]-lcp[mi][x1]*2; 
    printf("%d\n", ans); 
}

 

posted @ 2018-06-30 16:15  TOBICHI_ORIGAMI  阅读(36)  评论(0编辑  收藏  举报