题意
和手机的九键输入法一样。输入数据第一行给出有多少组测试数据,每组数据第一行给出w(0<=w<=1000),接下来w行给出一个单词以及该单词的出现频率p(1<=p<=100),每个单词的最大长度不超过100个字母;然后,给出一个整数m,接下来m行给出一个输入串,代表在手机上按了哪些键,每个输入串最多有100个字符,且以数字1作为结尾。要求根据给出输入串,输出在按这些键的过程中,输入法给出的首选项(即出现频率最高的单词),若没有对应输入的单词,则输出"MANUALLY"。
样例输入
2
5
hell 3
hello 4
idea 8
next 8
super 3
2
435561
43321
7
another 5
contest 6
follow 3
give 13
integer 6
new 14
program 4
5
77647261
6391
4681
26684371
77771
样例输出
Scenario #1:
i
id
hel
hell
hello
i
id
ide
idea
Scenario #2:
p
pr
pro
prog
progr
progra
program
n
ne
new
g
in
int
c
co
con
cont
anoth
anothe
another
p
pr
MANUALLY
MANUALLY
思路
以26个字母来建字典树,每个结点包含代表字母,频率,父节点以及一个指针数组。建树过程中,对于已存在的结点,频率要累加起来。查询的时候使用队列,先从树根的儿子里面找出第一个键所包含的各个字母的结点入队(如果该结点存在的话),并在入队的过程中找到频率最高的结点,依靠递归逆向输出。第二个键的时候,再从当前队列里的各个结点的儿子里找到对应第二个键包含的各个字母的结点入队(如果该结点存在的话),并在入队的过程中找到频率最高的结点,依靠递归逆向输出。以此类推...
注意点
1. 题目给出的单词库是按字典序排好的。
2. 输出每组样例之间有两个空行,一个空行是每个输入串后的,另一个空行是每组样例后的。
3. 当输入串只有一个1时,也要输出一个空行。
4. 用静态字典树的话记得初始化内存。
5. 频率是叠加起来的,例如这组数据
1
3
bbb 5
aaa 3
abc 3
1
21
输出的应该是a,而不是b。
1 #include <cstdio> 2 #include <string.h> 3 #include <queue> 4 using namespace std; 5 const char n2c[10][5] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; 6 struct TRIE 7 { 8 int chr, freq, father, Next[26]; 9 }trie[100000]; 10 int AMOUNT; 11 queue<int> q; 12 void Insert(char* str, int time) 13 { 14 int t, pos = 0; 15 for(int i=0; str[i]; ++i) 16 { 17 t = str[i] - 'a'; 18 trie[pos].freq += time; 19 if(!trie[pos].Next[t]) 20 { 21 trie[pos].Next[t] = ++AMOUNT; 22 memset(trie+AMOUNT, 0, sizeof(TRIE)); 23 trie[AMOUNT].father = pos; 24 pos = AMOUNT; 25 trie[pos].chr = str[i]; 26 } 27 else 28 pos = trie[pos].Next[t]; 29 } 30 trie[pos].freq += time; 31 } 32 void PrintStr(int x) 33 { 34 if(x) 35 { 36 PrintStr(trie[x].father); 37 printf("%c", trie[x].chr); 38 } 39 } 40 void Query(char* str) 41 { 42 int MAX, MAXTAG, t, num, pos; 43 q.push(0); 44 for(int i=0; str[i]!='1'; ++i) 45 { 46 t = str[i] - '0'; 47 num = q.size(); 48 MAX = MAXTAG = 0; 49 for(int j=0; j<num; ++j) 50 { 51 for(int k=0; n2c[t][k]; ++k) 52 { 53 pos = trie[q.front()].Next[ n2c[t][k] - 'a' ]; 54 if(pos) 55 { 56 q.push(pos); 57 if(trie[pos].freq > MAX) 58 MAX = trie[pos].freq, MAXTAG = pos; 59 } 60 } 61 q.pop(); 62 } 63 if(MAXTAG) 64 { 65 PrintStr(MAXTAG); 66 printf(" "); 67 } 68 else 69 { 70 for(; str[i] != '1'; ++i) 71 printf("MANUALLY "); 72 break; 73 } 74 } 75 num = q.size(); 76 while(num--) 77 q.pop(); 78 printf(" "); 79 } 80 int main(void) 81 { 82 char str[105]; 83 int kase, n, time; 84 scanf("%d", &kase); 85 for(int i=0; i<kase; ) 86 { 87 scanf("%d", &n); 88 AMOUNT = 0; 89 memset(trie, 0, sizeof(TRIE)); 90 for(int j=0; j<n; ++j) 91 { 92 scanf("%s %d", str, &time); 93 Insert(str, time); 94 } 95 printf("Scenario #%d: ", ++i); 96 scanf("%d", &n); 97 for(int j=0; j<n; ++j) 98 { 99 scanf("%s", str); 100 Query(str); 101 } 102 printf(" "); 103 } 104 return 0; 105 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
7 5 hell 3 hello 4 idea 5 next 8 super 3 2 787371 43321 7 another 5 contest 6 follow 3 give 13 integer 6 new 14 program 4 5 77647261 6391 4681 26684371 77771 7 gewel 5 hello 3 hell 2 rubmarine 4 ruper 4 suring 3 suesday 5 6 439351 435561 7826274631 787371 7874641 78373291 107 ab 2 aller 2 als 10 am 2 an 3 angerechnet 5 aus 2 begruessung 6 berichterstattung 13 bestehenden 13 bis 13 bislang 14 bitten 2 computing 2 dabei 10 darmstaedter 15 das 15 dass 8 dem 9 der 6 des 1 deutschland 9 diesem 6 eines 13 einzigen 12 entscheidet 2 erfolg 14 etwa 13 fachbereich 1 felix 15 findet 6 firma 8 fraikin 7 frankfurter 9 freuen 9 fuenf 10 fuer 4 gegeneinander 15 gelaende 5 gewinnen 1 gewinnt 12 gilt 5 hawaii 11 hinweis 14 informatikervereinigung 8 informatikwissen 12 innerhalb 6 jahr 15 koennen 7 konnte 8 kontakt 13 kryptographie 6 loesen 13 loest 2 loesung 3 machinery 6 merck 15 moechten 14 moeglich 7 moeglichst 3 muessen 15 nachmittags 15 nicht 1 november 6 prestigetraechtigen 11 programmiermeisterschaften 6 reicht 14 reines 15 reisen 5 rolle 10 seit 4 skandinavien 11 spielen 12 sporthalle 3 startschuss 6 statt 3 stattfindet 10 strafminuten 2 strasse 9 studierenden 8 teamfaehigkeit 9 teil 4 teilen 7 testierungssystem 5 ueber 9 veranstalter 4 veranstaltung 10 verbuchen 13 versuch 3 von 4 weltmeisterschaft 9 welttitelkaempfen 6 wer 8 werden 6 wettbewerb 5 wettkampf 6 wichtige 15 wie 2 wir 3 wird 13 wurde 8 zb 13 zeit 1 zeitmanagement 5 zu 9 zurueckgewiesene 4 zwar 15 10 721 5678381 57978647271 3224231 631 237834363361 3371 1 7877363278471 2378361 129 acm 9 alljaehrlich 13 am 2 anderem 8 anerkannt 6 angerechnet 5 antreten 9 aufgaben 8 ausschlag 13 beginnt 3 begruessung 6 beiden 14 beneluxstaaten 8 bereichen 15 berichterstattung 13 computing 2 darauf 4 darmstadt 7 darmstaedter 15 das 15 dass 8 den 15 der 6 des 1 die 2 diese 2 diesem 6 drei 12 dreierteams 4 eigentlichen 6 eine 2 einem 1 einer 15 email 6 erfolg 14 erreichen 3 erste 10 es 1 faellt 15 falk 13 fax 15 felix 15 finale 4 for 4 fraikin 7 frankfurter 9 gegeneinander 15 gelaende 5 gestellten 13 gewinnen 1 gewinnt 12 gilt 5 gleichstand 8 graphenalgorithmen 2 groessten 7 grossbritannien 10 gute 15 hinzuweisen 3 hoffen 7 informatik 13 informatikervereinigung 8 ist 1 kleinen 11 kniffliger 10 koennen 7 kostet 7 kryptographie 6 kurzer 10 leonhardt 8 loest 2 loesung 3 lokaler 4 merck 15 mit 15 moechten 14 moeglichst 3 muessen 15 nachmittags 15 nicht 1 nimmt 4 november 6 oder 10 philipp 9 programmieraufgaben 7 programmiermeisterschaften 6 rechnen 15 rechners 2 redaktionen 6 reines 15 reisen 5 rolle 10 samstag 3 seit 4 so 10 spannenden 8 spielen 12 sporthalle 3 stammen 14 startschuss 6 statt 3 strafminuten 2 strasse 9 studierenden 8 team 14 teamfaehigkeit 9 teilnehmer 10 tel 12 testierungssystem 5 testwettbewerb 14 thomas 14 tu 9 uhr 12 um 11 unter 4 veranstalter 4 verbuchen 13 versuch 3 viele 7 von 4 weltmeisterschaft 9 welttitelkaempfen 6 wer 8 werden 6 wettkampf 6 wie 2 wuerden 15 wurde 8 zu 9 zurueckgewiesene 4 29 35374353881 1 23431 8228431 67855776425731 672833842621 5666831 6381 662645436652731 26677841 1 438261 353648888621 621 77647261 61 5637361 8565444666831 338872452631 21 1 41 346371 36741 723448851 642481 4341 77435361 322234742673871 127 ab 2 aber 13 acht 11 acm 9 allen 11 als 10 am 2 an 3 antreten 9 auch 1 ausschlag 13 beginnt 3 begruessung 6 beneluxstaaten 8 bereichen 15 berichterstattung 13 bestehenden 13 bevorstehende 15 bislang 14 bitten 2 da 8 darauf 4 darmstadt 7 darmstaedter 15 das 15 dem 9 des 1 dreierteams 4 durfte 3 ein 2 eine 2 einen 1 einzigen 12 email 6 entspricht 10 erfolg 14 erreichen 3 es 1 fachbereich 1 fax 15 findet 6 firma 8 for 4 fraikin 7 frankfurter 9 freuen 9 fuenf 10 gestellten 13 gewinnt 12 graphenalgorithmen 2 groessten 7 grossbritannien 10 hawaii 11 im 3 informatik 13 innerhalb 6 internationalen 12 internet 2 ist 1 jeder 5 jeweils 15 kniffliger 10 koennen 7 konnte 8 kontakt 13 kostet 7 kurzer 10 leonhardt 8 loesen 13 loest 2 lokaler 4 lokales 7 machinery 6 maerz 2 moechten 14 moeglich 7 muessen 15 nachmittags 15 nimmt 4 nordwesteuropaeische 14 november 6 oder 10 prestigetraechtigen 11 programmiermeisterschaften 6 qualifizieren 15 raeumen 14 rechner 9 redaktionen 6 reihe 11 reines 15 reisen 5 rolle 10 schnuppern 12 seit 4 sie 3 skandinavien 11 spannenden 8 stammen 14 stattfindet 10 stringverarbeitung 11 studierende 15 studierenden 8 team 14 teamfaehigkeit 9 teil 4 teilen 7 teilnehmenden 4 testierungssystem 5 testwettbewerb 14 uhr 12 um 11 uns 14 veranstalter 4 veranstaltung 10 von 4 weltmeisterschaft 9 wettbewerb 5 wettbewerbs 1 wichtige 15 wieder 10 wir 3 wird 13 zb 13 zeitmanagement 5 zu 9 zurueckgewiesene 4 zwar 15 10 782883463381 1 8671 6465731 637877861 88567857631 5553682276351 22431 78641 222831 126 ab 2 acm 9 allen 11 aller 2 alljaehrlich 13 an 3 anerkannt 6 angerechnet 5 antreten 9 atlanta 2 aufgaben 8 ausgerichtet 12 ausschlag 13 automatisches 10 beginnt 3 begruessung 6 beiden 14 besten 4 bis 13 bitten 2 darmstaedter 15 das 15 dass 8 den 15 des 1 deutschland 9 die 2 diese 2 dreierteams 4 durfte 3 eigentlichen 6 eine 2 einem 1 einen 1 einer 15 eines 13 entscheidet 2 erfolg 14 erreichen 3 es 1 etwa 13 fachbereich 1 firma 8 for 4 frankfurter 9 gaertner 12 gegeneinander 15 gestellten 13 gewinnen 1 gewinnt 12 gleichstand 8 groessten 7 grossbritannien 10 hahn 1 hilfe 15 hinzuweisen 3 ihre 3 im 3 informatik 13 internationalen 12 jahr 15 kleinen 11 kniffliger 10 koennen 7 konnte 8 kontakt 13 korrekt 12 kurzer 10 lokaler 4 machinery 6 maerz 2 meisten 9 muessen 15 nachmittags 15 nicht 1 nimmt 4 november 6 ob 11 oder 10 programm 12 programmieraufgaben 7 qualifizieren 15 rechner 9 rechners 2 redaktionen 6 reihe 11 rolle 10 runde 5 samstag 3 schnuppern 12 sich 7 skandinavien 11 spannenden 8 spielen 12 sporthalle 3 stammen 14 startschuss 6 stattfindet 10 strafminuten 2 strasse 9 stringverarbeitung 11 studierende 15 stunden 1 teamfaehigkeit 9 teams 9 teil 4 teilen 7 teilnehmer 10 tel 12 testierungssystem 5 veranstalter 4 verbuchen 13 viele 7 vom 15 welttitelkaempfen 6 werden 6 wettbewerbs 1 wettkampfatmosphaere 15 wird 13 wuerden 15 zb 13 zeit 1 zu 9 zum 12 zur 3 zurueckgewiesene 4 30 55871 1 27843233576841 3668877481 73351 1 2363581 258453233661 25467248281 67357453856361 1 7383551 553221 5421 325551 441 44698934731 58667874282351 3431 31 432288536844481 778478561 4671 22287641 84438224826461 41 82383471 221 864365361 445328785821
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Scenario #1: s su sup supe super h he ide idea Scenario #2: p pr pro prog progr progra program n ne new g in int c co con cont anoth anothe another p pr MANUALLY MANUALLY Scenario #3: g ge gew gewe gewel g ge hel hell hello r ru rub rubm rubma rubmar rubmari rubmarin rubmarine r ru rup rupe ruper r ru rup suri surin suring r ru sue sues suesd suesda suesday Scenario #4: s MANUALLY k ko MANUALLY MANUALLY MANUALLY MANUALLY k kr kry kryp krypt krypto kryptog kryptogr kryptogra kryptograp d da dab fach fachb fachbe m me b be ber best beste besteh bestehe bestehen bestehend bestehende bestehenden d de der s st str MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY b be ber best beste MANUALLY Scenario #5: d MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY a be bei beid t MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY m MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY m MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY k ko MANUALLY MANUALLY MANUALLY MANUALLY m me MANUALLY m mo MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY a an com comp MANUALLY MANUALLY MANUALLY g ge MANUALLY MANUALLY MANUALLY d MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY m na s sp pro prog progr progra program m k ko koe loes MANUALLY MANUALLY t MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY d de MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY a g d ei ein eine einer d em for MANUALLY s sa MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY m mi nic nich nicht g ge geg s sp spi spie spiel spiele spielen d da MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY Scenario #6: s st sta stat statt stattf stattfi stattfin stattfind stattfinde stattfindet t un uns m ni nim MANUALLY MANUALLY MANUALLY m od MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY t MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY k MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY b ac ach MANUALLY s st MANUALLY MANUALLY b ac MANUALLY MANUALLY MANUALLY Scenario #7: k kl MANUALLY MANUALLY a MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY d fo MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY s re red MANUALLY a be MANUALLY MANUALLY MANUALLY MANUALLY a al MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY a al MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY m MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY s re MANUALLY MANUALLY MANUALLY MANUALLY k kl kle MANUALLY MANUALLY k MANUALLY MANUALLY d da MANUALLY MANUALLY MANUALLY g hi g hi hin hinz hinzu hinzuw hinzuwe hinzuwei hinzuweis hinzuweise k ku MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY d ei die d g ge MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY s sp MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY g in MANUALLY a ac MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY t vi MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY g t MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY a ac t vo MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY g hi hil hilf MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY MANUALLY