hdu 1298 T9

字典树+DFS。

#include<cstdio>

#include<cstring>

#include<cmath>

#include<string>

#include<algorithm>

using namespace std;



struct shu{ int value, nn[27]; }node[250010];

int n, q, i, ii, v, zz, tott, anss, tt, ttt;

const int INF = 0x7FFFFFFF;

char s[1000], sc[1000], vc[1000], ljb[10][10];



void ljbb()

{

    ljb[2][0] = 3; ljb[2][1] = 'a'; ljb[2][2] = 'b'; ljb[2][3] = 'c';

    ljb[3][0] = 3; ljb[3][1] = 'd'; ljb[3][2] = 'e'; ljb[3][3] = 'f';

    ljb[4][0] = 3; ljb[4][1] = 'g'; ljb[4][2] = 'h'; ljb[4][3] = 'i';

    ljb[5][0] = 3; ljb[5][1] = 'j'; ljb[5][2] = 'k'; ljb[5][3] = 'l';

    ljb[6][0] = 3; ljb[6][1] = 'm'; ljb[6][2] = 'n'; ljb[6][3] = 'o';

    ljb[7][0] = 4; ljb[7][1] = 'p'; ljb[7][2] = 'q'; ljb[7][3] = 'r'; ljb[7][4] = 's';

    ljb[8][0] = 3; ljb[8][1] = 't'; ljb[8][2] = 'u'; ljb[8][3] = 'v';

    ljb[9][0] = 4; ljb[9][1] = 'w'; ljb[9][2] = 'x'; ljb[9][3] = 'y'; ljb[9][4] = 'z';

}



void dfs(int ff, int zzz, int gl)

{

    int i;

    if (ff == ttt)

    {

        if (node[zzz].value > anss)

        {

            anss = node[zzz].value;

            sc[gl] = '\0';

            strcpy(vc, sc);

        }

        return;

    }

    if (s[ff] == '1') dfs(ff + 1, zzz, gl);

    for (i = 1; i <= ljb[s[ff] - '0'][0]; i++)

    {

        if (node[zzz].nn[ljb[s[ff] - '0'][i] - 'a'] != -1)

        {

            sc[gl] = ljb[s[ff] - '0'][i];

            dfs(ff + 1, node[zzz].nn[ljb[s[ff] - '0'][i] - 'a'], gl + 1);

        }

    }

}



int main()

{

    ljbb();

    int sb, bs;

    scanf("%d", &sb);

    for (bs = 1; bs <= sb; bs++)

    {



        scanf("%d", &n);

        for (i = 0; i <= 250000; i++)

        {

            node[i].value = 0;

            memset(node[i].nn, -1, sizeof(node[i].nn));

        }

        tott = 1;

        for (ii = 0; ii < n; ii++)

        {

            scanf("%s%d", s, &v);

            zz = 0;

            for (i = 0; s[i]; i++)

            {

                if (node[zz].nn[s[i] - 'a'] == -1)

                {

                    node[zz].nn[s[i] - 'a'] = tott;

                    tott++;

                }

                zz = node[zz].nn[s[i] - 'a'];

                node[zz].value += v;

            }

        }

        scanf("%d", &q);

        printf("Scenario #%d:\n", bs);

        for (ii = 0; ii < q; ii++)

        {

            scanf("%s", s);

            tt = strlen(s);

            for (i = 1; i < tt; i++)

            {

                anss = -INF;

                ttt = i;

                dfs(0, 0, 0);

                if (anss == -INF) printf("MANUALLY\n");

                else printf("%s\n", vc);

            }

            printf("\n");

        }

        printf("\n");

    }

    return 0;

}

 

你可能感兴趣的:(HDU)