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; }