POJ 1451 T9 字典树

题意
和手机的九键输入法一样。输入数据第一行给出有多少组测试数据,每组数据第一行给出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("\n");
 67         }
 68         else
 69         {
 70             for(; str[i] != '1'; ++i)
 71                 printf("MANUALLY\n");
 72             break;
 73         }
 74     }
 75     num = q.size();
 76     while(num--)
 77         q.pop();
 78     printf("\n");
 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:\n", ++i);
 96         scanf("%d", &n);
 97         for(int j=0; j<n; ++j)
 98         {
 99             scanf("%s", str);
100             Query(str);
101         }
102         printf("\n");
103     }
104     return 0;
105 }
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
in
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
out

 

posted @ 2016-05-02 09:32  Corvey  阅读(503)  评论(0编辑  收藏  举报