字典树+AC自动机Hyper Prefix SetsUVA11488YTACM第一周E

来源:互联网 发布:笑傲江湖 版本 知乎 编辑:程序博客网 时间:2024/05/16 06:11


Pre x goodness of a set string is length of longest common pre x*number of strings in the set. For
example the pre x goodness of the set f000,001,0011g is 6.You are given a set of binary strings. Find
the maximum pre x goodness among all possible subsets of these binary strings.
Input
First line of the input contains T ( 20) the number of test cases. Each of the test cases start with n
( 50000) the number of strings. Each of the next n lines contains a string containing only `0' and `1'.
Maximum length of each of these string is 200.
Output
For each test case output the maximum pre x goodness among all possible subsets of n binary strings.
Sample Input
4
4
0000
0001
10101
010
2
01010010101010101010
11010010101010101010
3
010101010101000010001010
010101010101000010001000
010101010101000010001010
5
01010101010100001010010010100101
01010101010100001010011010101010
00001010101010110101
0001010101011010101
00010101010101001
Sample Output
6
20
66
44

ACcode:

#include <iostream>#include<cstdlib>#include<cstdio>#include<string.h>#include<cstring>using namespace std;#define N 50001#define M 202int nn,ans;int  n,t;struct DT//字典树结构体{    int chid[2];    int num;//记录当前字符出现的次数    void init()    {        num=0;        memset(chid,-1,sizeof(chid));    }} dt[N*10];char str[N][M];void Init()//初始化{    nn=ans=0;    for(int i=0; i<N*10; i++)        dt[i].init();}void Insert(char s[])//插入字符串到字典树中,并寻找最佳答案{    int x=0;    int chnum;    int ls=strlen(s);    for(int i=0; i<ls; i++)    {        chnum=s[i]-'0';        if(dt[x].chid[chnum]==-1)        {            dt[x].chid[chnum]=++nn;        }        x=dt[x].chid[chnum];        dt[x].num++;        ans=max(ans,(i+1)*dt[x].num);//比较最大的goodness字符串前缀    }}void Read()//输入{    for (int i=0; i<n; ++i)    {        scanf("%s", str[i]);        Insert(str[i]);    }    return;}int main(){    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        Init();        Read();        printf("%d\n",ans);    }}
Running Error是开的空间不够大 


0 0