日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ 1055 [HAOI2008]玩具取名

發布時間:2024/8/26 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 1055 [HAOI2008]玩具取名 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1055: [HAOI2008]玩具取名

Time Limit:?10 Sec??Memory Limit:?162 MB
Submit:?1119??Solved:?653
[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


?

?

Source

題解:區間DP嘛,L~R用a組可不可以,每次用字典來分割區間。

又因為沒有解的情況WA了一發= =。。。。。。。。

1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<stack> 6 #include<queue> 7 #include<cstring> 8 #define PAU putchar(' ') 9 #define ENT putchar('\n') 10 using namespace std; 11 const int maxn=200+10,inf=-1u>>1; 12 int id(char ch){ 13 if(ch=='W')return 0; 14 if(ch=='I')return 1; 15 if(ch=='N')return 2; 16 if(ch=='G')return 3; 17 return -1; 18 } 19 void princ(int a){ 20 if(!a)putchar('W'); 21 else if(a==1)putchar('I'); 22 else if(a==2)putchar('N'); 23 else if(a==3)putchar('G'); 24 return; 25 } 26 int t[4],tx[4][20][2],arr[maxn];int dp[4][maxn][maxn]; 27 bool solve(int a,int L,int R){ 28 int&res=dp[a][L][R];if(res!=-1)return res; 29 if(L==R)return (res=(arr[L]==a)); 30 for(int i=L;i<R;i++){ 31 for(int j=0;j<t[a];j++){ 32 if(solve(tx[a][j][0],L,i)&&solve(tx[a][j][1],i+1,R))return (res=true); 33 } 34 }return (res=false); 35 } 36 inline int read(){ 37 int x=0;bool sig=1;char ch=getchar(); 38 for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=0; 39 for(;isdigit(ch);ch=getchar())x=10*x+ch-'0'; 40 return sig?x:-x; 41 } 42 inline void write(int x){ 43 if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x; 44 int len=0,buf[20];while(x)buf[len++]=x%10,x/=10; 45 for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return; 46 } 47 char s[maxn]; 48 int main(){ 49 for(int i=0;i<4;i++)t[i]=read(); 50 for(int i=0;i<4;i++){ 51 for(int j=0;j<t[i];j++){ 52 scanf("%s",s);tx[i][j][0]=id(s[0]);tx[i][j][1]=id(s[1]); 53 } 54 } 55 scanf("%s",s); 56 for(int i=0;s[i];i++)arr[i]=id(s[i]);int Len=strlen(s); 57 memset(dp,-1,sizeof(dp));bool flag=false; 58 for(int i=0;i<4;i++){ 59 if(solve(i,0,Len-1))princ(i),flag=true; 60 } 61 if(!flag)puts("The name is wrong!"); 62 return 0; 63 }

?

轉載于:https://www.cnblogs.com/chxer/p/4736265.html

總結

以上是生活随笔為你收集整理的BZOJ 1055 [HAOI2008]玩具取名的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。