首页 > 代码库 > Facebook Hacker Cup 2015 Round 1 --- Autocomplete

Facebook Hacker Cup 2015 Round 1 --- Autocomplete

Since you crave state-of-the-art technology, you‘ve just purchased a phone with a great new feature: autocomplete! Your phone‘s version of autocomplete has some pros and cons. On the one hand, it‘s very cautious. It only autocompletes a word when it knows exactly what you‘re trying to write. On the other hand, you have to teach it every word you want to use.

You have N distinct words that you‘d like to send in a text message in order. Before sending each word, you add it to your phone‘s dictionary. Then, you write the smallest non-empty prefix of the word necessary for your phone to autocomplete the word. This prefix must either be the whole word, or a prefix which is not a prefix of any other word yet in the dictionary.

What‘s the minimum number of letters you must type to send all N words?

Input

Input begins with an integer T, the number of test cases. For each test case, there is first a line containing the integer N. Then,N lines follow, each containing a word to send in the order you wish to send them.

Output

For the ith test case, print a line containing "Case #i: " followed by the minimum number of characters you need to type in your text message.

Constraints

1 ≤ T ≤ 100 
1 ≤ N ≤ 100,000 

The N words will have a total length of no more than 1,000,000 characters. 
The words are made up of only lower-case alphabetic characters. 
The words are pairwise distinct. 

NOTE: The input file is about 10-20MB.

Explanation of Sample

In the first test case, you will write "h", "he", "l", "hil", "hill", for a total of 1 + 2 + 1 + 3 + 4 = 11 characters.


给n个单词,每次添加一个,查找一个,问查找你添加的这个单词,至少需要确定前多少个字母,可以确定这个单词。

求查找每个单词需要确定的字母数的和。


#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1000100;
int dic[maxn][26],val[maxn],cnt;
void inst(string s)
{
    int u,v,l,len;
    u=0,len=s.size();
    for(l=0;l<len;l++)
    {
        v=s[l]-'a';
        if(!dic[u][v])
        {
            dic[u][v]=++cnt;
            memset(dic[cnt],0,sizeof dic[cnt]);
        }
        u=dic[u][v];
        val[u]++;
    }
}

int get(string s)
{
    int u,v,l,len,ret;
    u=0,len=s.size();
    ret=len;
    for(l=0;l<len-1;l++)
    {
        v=s[l]-'a';;
        if(val[dic[u][v]]==1)//若这个字母之后都是1,说明没有其他单词了,到这就可以确定
        {
            ret=l+1;
            break;
        }
        u=dic[u][v];
    }
    return ret;
}

int main()
{
    freopen("autocomplete.txt","r",stdin);
    freopen("outb.txt","w",stdout);
    int T,cas=1,i,n;
    string s;
    scanf("%d",&T);
    while(T--)
    {
        memset(dic[0],0,sizeof dic[0]);
        memset(val,0,sizeof val);
        cnt=0;
        scanf("%d",&n);
        int ans=0;
        for(i=0;i<n;i++)
        {
            cin>>s;
            inst(s);
            ans+=get(s);
        }
        printf("Case #%d: %d\n",cas++,ans);
    }
    return 0;
}


Facebook Hacker Cup 2015 Round 1 --- Autocomplete