BZOJ 1055 HAOI2008 玩具命名

2022-08-16 17:15:20 字數 1826 閱讀 9544

1055

: [haoi2008]玩具取名

time limit:

10 sec memory limit: 162

mbsubmit:

2141 solved: 1254

[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 input11

1iiwwww

igiiii

sample output

inhint

w可以變成ii所以iiii可以縮成ww in均能變成ww所以ww又可以縮成i或者n 所以最終答案應該按照「wing」的順序

輸出in

[資料範圍]

100%資料滿足len<=200,w、i、n、g<=16

dp

設f[i][j][k]表示從i到j是否可以表示為k

按照題目給的條件轉移即可

1 #include 2

using

namespace

std;

3int f[210][210][5];4

int a[5][20][2];5

int sum[5

],strl;

6 inline int dp(int leftt,int rightt,int

k)13}14

return

f[leftt][rightt][k];15}

16void

init()

20for(int i=1;i<=4;i++)33}

34 memset(f,-1,sizeof

(f));

35string

str;

36 cin>>str;

37 strl=str.size();

38for(int i=0;i)

42if(str[i]=='

w') f[i+1][i+1][1]=1;43

if(str[i]=='

i') f[i+1][i+1][2]=1;44

if(str[i]=='

n') f[i+1][i+1][3]=1;45

if(str[i]=='

g') f[i+1][i+1][4]=1;46

}47}48

void

solve()58}

59if(!flag) cout<

the name is wrong!

"<

61int

main()

**

BZOJ1055 HAOI 玩具取名

某人有一套玩具,並想法給玩具命名。首先他選擇wing四個字母中的任意乙個字母作為玩具的基本名字。然後 他會根據自己的喜好,將名字中任意乙個字母用 wing 中任意兩個字母代替,使得自己的名字能夠擴充得很長。現在,他想請你猜猜某乙個很長的名字,最初可能是由哪幾個字母變形過來的。第一行四個整數w i n...

BZOJ 1055 HAOI2008 玩具取名

題目 分析 正著想不好搞,狀態太多,也不好轉移,肯定超時。於是我們反著想,將一條字串歸約成乙個字母,首先能想到乙個字串必須要先變成字母,才能變成乙個字母,而且這兩個字母中的第乙個字母一定是由左邊歸約出來的,第二個字母是由右邊歸約出來的。好的思路馬上就來了,我們用dp i j k 表示字串 i,j 能...

BZOJ1055 HAOI2008 玩具取名

標籤 區間dp description 某人有一套玩具,並想法給玩具命名。首先他選擇wing四個字母中的任意乙個字母作為玩具的基本名字。然後 他會根據自己的喜好,將名字中任意乙個字母用 wing 中任意兩個字母代替,使得自己的名字能夠擴充得很長。現在,他想請你猜猜某乙個很長的名字,最初可能是由哪幾個...