題意:
給你多條英語對應火星文,然後在下面輸入一堆火星文,要你翻譯成英文,如果一些火星文沒有對應的英文的話就輸出原火星文就可以了,有就輸出英文。
題解:
一看到這道題就想到了map容器,奈何挺久沒用過了,導致我很難下手,還是去看了別人怎麼寫的記憶才慢慢復甦,怎麼說呢,stl是個神器,但是我用不習慣。。。orz,既然這道題是一道字典樹的題目的話,咱們就用字典樹的做法去做吧。
怎麼做呢?把輸入的英文存放起來,而火星文則存進字典樹中,在每個火星文最後的樹節點中標記編號,然後find函式查詢這個火星文是否有對應的英文,有的話就輸出英文,沒有就輸出原文。這道題就過了,但是有點坑爹的是,要稍微判斷一下沒有火星文的情況,另外還有一點坑爹的就是你陣列要開到100萬,不然會超時的,這一度讓我懷疑是不是我字典樹寫錯了。
還有一種省略了陣列的寫法,在我自己的做法的下面,大家可以去看看。
字典樹做法:
#include
#include
#include
#include
using
namespace
std;
const
int maxn=1000000+7;//這坑爹的玩意要開100w..我開3000超時導致我一度以為我的字典樹寫錯了。
struct node
}*root;
int tot=0;
char s[maxn][15];
void insert(char *s)
r->cnt=tot++;
}int find(char *s)
return r->cnt;
}int main()
scanf("%s",c);
getchar();
while(gets(c))
x[m]='\0';
m=0;
if(find(x)!=-1)
printf("%s",s[find(x)]);
else
printf("%s",x);
printf("%c",c[i]);
}printf("\n");
}}
還有一種不用陣列更好的寫法:
#include
#include
#include
using
namespace
std;
struct node
}*root;
char c[15];
void insert(char *s)
r->cnt=1;
strcpy(r->s,c);
}char *find(char *s)
if(r->cnt)
return r->s;
else
return s;
} void del(node *head)
int main()
scanf("%s",c);
getchar();
char str[3007];
while(gets(str))
}printf("\n");
}del(root);
}
map容器的寫法:
#include
#include
#include
#include
using
namespace
std;
const
int maxn=3000+7;
mapmp;
char s[maxn];
int main()
cin>>a;
getchar();//要加上這個吸收換行符。
while(1)
HDU 1075 字典樹模板
題目傳送門 伊格那丟很幸運,昨天他遇見了乙個火星人。但是他不懂火星人使用的語言。火星人給了他一本關於火星的歷史書和一本字典。現在伊格內修斯想把這本歷史書譯成英語。你能幫助他嗎?輸入問題只有乙個測試用例,測試用例由兩個部分組成,字典部分和書籍部分。字典部分從一行開始包含乙個字串 start 這個字串應...
hdu 1075 (字典樹對映)
問題 輸入一段英文,對照給的單詞的對映,輸出對映後的字串 yy 典型的字典樹問題,先處理好對映表,在一對映單詞結尾處記錄與之對應的單詞,後面字串處理一下,單個單詞進行查,找到後輸出,沒有輸出原始詞 剛開始交re越界,不解,覺得是指標問題,但找不出錯處 後來找到個神奇資料後改過就a了 start do...
hdu4415 不錯的想法題
題意 乙個人他有一定的血,有一些怪物,他去殺怪物,有的怪物殺死他後還可以在不費自己血的情況下任意殺死一些怪物,問你他最多殺死多少怪物,在最多殺怪前提下最好用多少血,大體題意是這樣 思路 首先我們把怪物分成兩個集合,a乙個是殺死他後可以免費殺死其他人的,b另乙個是殺死他後不能免費殺死其他人的,分析下我...