zoukankan      html  css  js  c++  java
  • 1055: [HAOI2008]玩具取名

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 2459  Solved: 1433
    [Submit][Status][Discuss]

    Description

      某人有一套玩具,并想法给玩具命名。首先他选择WING四个字母中的任意一个字母作为玩具的基本名字。然后
    他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得很长。
    现在,他想请你猜猜某一个很长的名字,最初可能是由哪几个字母变形过来的。

    Input

      第一行四个整数W、I、N、G。表示每一个字母能由几种两个字母所替代。接下来W行,每行两个字母,表示W可
    以用这两个字母替代。接下来I行,每行两个字母,表示I可以用这两个字母替代。接下来N行,每行两个字母,表示N
    可以用这两个字母替代。接下来G行,每行两个字母,表示G可以用这两个字母替代。最后一行一个长度不超过Len的
    字符串。表示这个玩具的名字。

    Output

      一行字符串,该名字可能由哪些字母变形而得到。(按照WING的顺序输出)如果给的名字不能由任何一个字母
    变形而得到则输出“The name is wrong!”

    Sample Input

    1 1 1 1
    II
    WW
    WW
    IG
    IIII

    Sample Output

    IN

    HINT

     

    W可以变成II所以IIII可以缩成WW IN均能变成WW所以WW又可以缩成I或者N 所以最终答案应该按照“WING”的顺序

    输出IN 

    [数据范围]

    100%数据满足Len<=200,W、I、N、G<=16
     
    手贱多打个分号,调了我半个小时。。。
    设f[l][r][k]表示范围l~r可以置换为字母k
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 
     6 char p[4]={'W','I','N','G'};
     7 char a[4][20][2],ch[205];
     8 int t[4],P[255],f[205][205][4];;
     9 
    10 bool dp(int l,int r,int k)
    11 {
    12     if(l==r) return ch[l]==p[k];
    13     int &res=f[l][r][k];
    14     if(res!=-1) return res;
    15     for(int i=l;i<r;i++)
    16         for(int j=0;j<t[k];j++)
    17             if(dp(l,i,P[a[k][j][0]])&&dp(i+1,r,P[a[k][j][1]]))
    18                 return res=1;
    19     return res=0;
    20 }
    21 
    22 int main()
    23 {
    24     P['W']=0;P['I']=1;P['N']=2;P['G']=3;
    25     memset(f,-1,sizeof(f));
    26     for(int i=0;i<4;i++) scanf("%d",&t[i]);
    27     for(int i=0;i<4;i++)
    28         for(int j=0;j<t[i];j++) scanf("%s",a[i][j]);
    29     scanf("%s",ch+1);
    30     int len=strlen(ch+1);
    31     bool flag=0;
    32     for(int i=0;i<4;i++)
    33         if(dp(1,len,i)) flag=1,printf("%c",p[i]);
    34     if(!flag) printf("The name is wrong!");
    35     return 0;
    36 }
  • 相关阅读:
    BZOJ 1101 莫比乌斯函数+分块
    BZOJ 2045 容斥原理
    BZOJ 4636 (动态开节点)线段树
    BZOJ 2005 容斥原理
    BZOJ 2190 欧拉函数
    BZOJ 2818 欧拉函数
    BZOJ 3123 主席树 启发式合并
    812. Largest Triangle Area
    805. Split Array With Same Average
    794. Valid Tic-Tac-Toe State
  • 原文地址:https://www.cnblogs.com/InWILL/p/9489712.html
Copyright © 2011-2022 走看看