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

题目描述:

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-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.

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-10
#define pi acos(-1.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\n",ans);
            }
            printf("Case #%d: %d\n",case1++,ans);
        }
    }
    return 0;
}

题目最终测试数据:

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

密码: 1dgp

时间: 2024-08-28 00:55:14

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

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

题目描述: Homework10 points Your first-grade math teacher, Mr. Book, has just introduced you to an amazing new concept - primes! According to your notes, a prime is a positive integer greater than 1 that is divisible by only 1 and itself. Primes seem fun

Facebook Hacker Cup 2015 Round 1 Winning at Sports (附带测试数据)

题目描述: Winning at Sports25 points In the game of Sports, the object is have more points than the other team after a certain amount of time has elapsed. Scores are denoted by two hyphen-separated integers. For example, scores may include 3-2, 4-1, or 1

Facebook Hacker Cup 2015 Round 1--Corporate Gifting(树形动态规划)

原题:https://www.facebook.com/hackercup/problems.php?pid=759650454070547&round=344496159068801 题意:给定一颗有根树,在树上下层的节点要给上层节点礼物,根节点的礼物则给慈善会,但是给礼物有个条件就是你不能送你的父节点已经送出的礼物.问满足要求的最少花费. 题解:这个题卡了一段时间,类似于染色问题,可以用树形动态规划求解.因为已知节点个数为N,则我们单个节点的最大花费不会超过log2(N) = 18. 1.

Facebook Hacker Cup 2015 Round 1--Winning at Sports(动态规划)

原题:https://www.facebook.com/hackercup/problems.php?pid=688426044611322&round=344496159068801 题意:你和一个朋友玩足球游戏,分数从0-0开始,最终你总是赢,并且你主要有两种方式赢,第一种stressFree方式你肯定要进第一个球并且总是比你的朋友分数高,第二种stressFull方式除了你的朋友达到最终分数时,在游戏中你不可能比你的朋友分数高.给出一个比分,请分别输出在两种情况下你能赢的方式. 题解:类似

Facebook Hacker Cup 2015 Round 1--Autocomplete(字典树新建与查询)

题意:给定N个字符串,让你依次先输入到手机的字典中,再打印出来,打印的时候我们只需要输出字符串的前缀或者全部字符串,要求此前缀不是以往任何字符串的前缀. 题解:典型的字典树,可以利用结构体数组方便的新建与查询,速度比链表更快.只需在插入字符串时统计最长相同的前缀即可. 代码如下: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define maxN 1000005

Facebook Hacker Cup 2015 Round 1--Homework(筛选法求素数)

题意:给定A,B,K(A<=B)三个数,问在[A,B]范围内的数素数因子个数为K的个数. 题解:典型的筛选法求素数.首先建立一个保存素数因子个数的数组factorNum[],以及到n为止含有素数因子个数为k的二维数组sumNum[n][k]. factorNum可以由筛选法确定,初始化数组为0. 1. 从小到大遍历给定最大范围内的数,若遍历到数n时,factorNum[n]=0则说明这个数是素数(前面没有它的因子). 2. 然后通过增加n的倍数,来筛选出最大范围内含有素数因子n的数. sumNu

Facebook Hacker Cup 2015 Round 1 --- Homework

给一个区间,求该区间内 质因子个数等于k的数 的个数. 暴力预处理一下啦 #include<cstdio> #include<cstring> using namespace std; const int maxn=10000010; bool pri[maxn]; int cnt[maxn]; void init() { memset(pri,1,sizeof pri); memset(cnt,0,sizeof cnt); for(int i=2;i<=10000000;i

Facebook Hacker Cup 2015 Round 1 --- Winning at Sports

In the game of Sports, the object is have more points than the other team after a certain amount of time has elapsed. Scores are denoted by two hyphen-separated integers. For example, scores may include 3-2, 4-1, or 10-0. The first number is how many