某人有一套玩具,並想法給玩具命名。首先他選擇\(wing\)四個字母中的任意乙個字母作為玩具的基本名字。然後他會根據自己的喜好,將名字中任意乙個字母用\(「wing」\)中任意兩個字母代替,使得自己的名字能夠擴充得很長。
現在,他想請你猜猜某乙個很長的名字,最初可能是由哪幾個字母變形過來的。
第一行四個整數\(w,i,n,g\)。表示每乙個字母能由幾種兩個字母所替代。
接下來\(w\)行,每行兩個字母,表示\(w\)可以用這兩個字母替代。
接下來\(i\)行,每行兩個字母,表示\(i\)可以用這兩個字母替代。
接下來\(n\)行,每行兩個字母,表示\(n\)可以用這兩個字母替代。
接下來\(g\)行,每行兩個字母,表示\(g\)可以用這兩個字母替代。
最後一行乙個長度不超過\(len\)的字串。表示這個玩具的名字。
一行字串,該名字可能由哪些字母變形而得到。(按照\(wing\)的順序輸出)
如果給的名字不能由任何乙個字母變形而得到則輸出\(「the\)
\(name\)
\(is\)
\(wrong!」\)
輸入 #1
1 1 1 1
iiww
wwig
iiii
輸出 #1
in
\(30\%\)資料滿足\(len\leq 20\),\(w,i,n,g\leq 6\)
\(100\%\)資料滿足\(len\leq 200\),\(w,i,n,g\leq 16\)
考場上此題被放在了\(t3\),於是沒有好好想。結果發現非常水。
簡單的區間\(dp\),符合基本的合併規律。我們用\(dp[i][j][k]\)表示區間\([i,j]\)能否合成第\(k\)號字母。我們列舉中間的端點即可。
#include#include#include#include#include#include#define int long long
#define rep(i,a,n) for(register int i=a;i<=n;++i)
#define dwn(i,n,a) for(register int i=n;i>=a;--i)
using namespace std;
int w,i,n,g,dp[405][405][10];
int e[405][405][10];
char name[1050],str[1050];
static const char let[5]=;//標記四個字元的編號
inline int read()
while(isdigit(ch))
return x*f;
}void write(int x)
signed main()
rep(i,2,len)}}
}} }
if(!(dp[1][len][1]|dp[1][len][2]|dp[1][len][3]|dp[1][len][4]))puts("the name is wrong!");
if(dp[1][len][1])putchar('w');
if(dp[1][len][2])putchar('i');
if(dp[1][len][3])putchar('n');
if(dp[1][len][4])putchar('g');
return 0;
}
自己卡一下常數。加油。 HAOI2008 玩具取名
haoi2008 玩具取名 時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld某人有一套玩具,並想法給玩具命名。首先他選擇wing四個字母中的任意乙個字母作為玩具的基本名字。然後他會根據自己的喜好,將名字中任意乙個字...
BZOJ1055 HAOI 玩具取名
某人有一套玩具,並想法給玩具命名。首先他選擇wing四個字母中的任意乙個字母作為玩具的基本名字。然後 他會根據自己的喜好,將名字中任意乙個字母用 wing 中任意兩個字母代替,使得自己的名字能夠擴充得很長。現在,他想請你猜猜某乙個很長的名字,最初可能是由哪幾個字母變形過來的。第一行四個整數w i n...
區間dp HAOI2008 玩具取名
簡單的區間合併,因為最終結果的長度最多為4,所以dp設為3維,dp i j k 表示 i,j 區間內能否由k這個字母產生。include using namespace std typedef long long ll 三年競賽一場空,不開long long見祖宗 typedef int128 ll...