hdu 3460 Ancient Printer

答案=字典树节点个数+单词个数-最长的单词的长度。表示不会推倒。看了大牛博客。

#include<cstdio>

#include<cstring>

#include<cmath>

#include<algorithm>

using namespace std;



struct shu{ int nn[27]; }node[500010];

int ii, i, n, m, zz, tott, hh;

char s[10000];



int main()

{ 

    

    while (~scanf("%d", &n))

    {

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

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

        tott = 1; hh = -1;

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

        {

            scanf("%s", s);

            int len = strlen(s);

            if (len>hh) hh = len;

            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'];

            }

        }

        printf("%d\n", (tott - 1) * 2 + n - hh);

    }

    return 0;

}

 

你可能感兴趣的:(print)