国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > 综合技术 > Facebook Hacker Cup 2015 Round 1 Autocomplete (附带测试数据)

Facebook Hacker Cup 2015 Round 1 Autocomplete (附带测试数据)

来源:程序员人生   发布时间:2015-01-30 08:35:04 阅读次数:3037次



题目描写:


Autocomplete25 points
                                          
  •                   

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⑵0MB.

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.

Example input ・        
Example output ・        
5 5 hi hello lol hills hill 5 a aa aaa aaaa aaaaa 5 aaaaa aaaa aaa aa a 6 to be or not two bee 3 having fun yet
Case #1: 11 Case #2: 15 Case #3: 11 Case #4: 9 Case #5: 3
                                





















解题思路:


使用字典树可以求出该字符串是不是和其他字符串有公共前缀。具体看代码



题目代码:

#include <set> #include <map> #include <queue> #include <math.h> #include <vector> #include <string> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <cctype> #include <algorithm> #define eps 1e⑴0 #define pi acos(⑴.0) #define inf 107374182 #define inf64 1152921504606846976 #define lc l,m,tr<<1 #define rc m + 1,r,tr<<1|1 #define zero(a) fabs(a)<eps #define iabs(x) ((x) > 0 ? (x) : -(x)) #define clear1(A, X, SIZE) memset(A, X, sizeof(A[0]) * (min(SIZE,sizeof(A)))) #define clearall(A, X) memset(A, X, sizeof(A)) #define memcopy1(A , X, SIZE) memcpy(A , X ,sizeof(X[0])*(SIZE)) #define memcopyall(A, X) memcpy(A , X ,sizeof(X)) #define max( x, y ) ( ((x) > (y)) ? (x) : (y) ) #define min( x, y ) ( ((x) < (y)) ? (x) : (y) ) using namespace std; struct node { int p[27]; int cnt; bool alive; } treenode[1000005]; int ans,nodecnt; char s[1000005]; void insertto() { int len=strlen(s),p=0; ans++; if(treenode[p].p[s[0]-'a']==0) { clearall(treenode[nodecnt].p,0); treenode[nodecnt].cnt=0; treenode[nodecnt].alive=false; treenode[p].p[s[0]-'a']=nodecnt++; } p=treenode[p].p[s[0]-'a']; treenode[p].cnt++; for(int i=1; i<len; i++) { if(treenode[p].p[s[i]-'a']==0) { clearall(treenode[nodecnt].p,0); treenode[nodecnt].cnt=0; treenode[nodecnt].alive=false; treenode[p].p[s[i]-'a']=nodecnt++; } if(treenode[p].cnt==1&&treenode[treenode[p].p[s[i]-'a']].cnt==0) { } else ans++; treenode[treenode[p].p[s[i]-'a']].cnt++; p= treenode[p].p[s[i]-'a']; } } int main() { //freopen("data.in","r",stdin); //freopen("data.txt","w",stdout); int t,case1=1; while(scanf("%d",&t)!=EOF) { while(t--) { clearall(treenode[0].p,0); treenode[0].cnt=0; treenode[0].alive=false; nodecnt=1; ans=0; int n; scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%s",s); insertto(); //printf("%d ",ans); } printf("Case #%d: %d ",case1++,ans); } } return 0; }


题目终究测试数据:


链接: http://pan.baidu.com/s/1o6oiwY2 

密码: 1dgp

生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生