CSU1115——最短的名字

来源:互联网 发布:java二分法查找 编辑:程序博客网 时间:2024/06/14 01:06
在一个奇怪的村子中,很多人的名字都很长,比如aaaaa, bbb and abababab。
名字这么长,叫全名显然起来很不方便。所以村民之间一般只叫名字的前缀。比如叫'aaaaa'的时候可以只叫'aaa',因为没有第二个人名字的前三个字母是'aaa'。不过你不能叫'a',因为有两个人的名字都以'a'开头。村里的人都很聪明,他们总是用最短的称呼叫人。输入保证村里不会有一个人的名字是另外一个人名字的前缀(作为推论,任意两个人的名字都不会相同)。
如果村里的某个人要叫所有人的名字(包括他自己),他一共会说多少个字母?
Input
输入第一行为数据组数T (T<=10)。每组数据第一行为一个整数n(1<=n<=1000),即村里的人数。以下n行每行为一个人的名字(仅有小写字母组成)。输入保证一个村里所有人名字的长度之和不超过1,000,000。
Output

对于每组数据,输出所有人名字的字母总数。

Sample Input
13aaaaabbbabababab
Sample Output

5

暴力出奇迹,模拟字典树(当然用字典树更好)

#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <cmath>#include <algorithm>#include <vector>#include <map>#include <string>#include <stack>using namespace std;typedef long long ll;#define PI 3.1415926535897932#define E 2.718281828459045#define INF 0x3f3f3f3f#define mod 100000007const int M=1005;int n,m;int cnt;int sx,sy,sz;//int g[M][M];int pa[M*10],rankk[M];int head[M*6],vis[M*100];int dis[M*100];ll prime[M*1000];bool isprime[M*1000];int lowcost[M],closet[M];char st1[5050],st2[5050];int len[M*6];typedef pair<int ,int> ac;//vector<int> g[M*10];int dp[M];int has[10500];int month[13]= {0,31,59,90,120,151,181,212,243,273,304,334,0};int dir[8][2]= {{0,1},{0,-1},{-1,0},{1,0},{1,1},{1,-1},{-1,1},{-1,-1}};void getpri(){    ll i;    int j;    cnt=0;    memset(isprime,false,sizeof(isprime));    for(i=2; i<1000000LL; i++)    {        if(!isprime[i])prime[cnt++]=i;        for(j=0; j<cnt&&prime[j]*i<1000000LL; j++)        {            isprime[i*prime[j]]=1;            if(i%prime[j]==0)break;        }    }}struct node{    int v,w;    node(int vv,int ww)    {        v=vv;        w=ww;    }};vector<int> g[M*100];string str[1000];//int dp[10000];int a[1000][1000];int main(){    int i,j,k,t;    int u,v,w;    cin>>t;    while(t--)    {        memset(dp,0,sizeof(dp));        memset(a,0,sizeof(a));        // int aid=0,k=0;        int sum=0;        cnt=0;        int maxx=-1;        cin>>n;        for(i=0; i<n; i++)        {            cin>>str[i];            a[i][0]=1;        }        for(i=1; i<n; i++)        {            //maxx=-1;            for(j=0; j<i; j++)            {                int l=str[i].length()<=str[j].length()?str[i].length():str[j].length();                k=0;                while(k<l)                {                    if(str[i][k]==str[j][k])                    {                        a[i][k+1]=a[j][k+1]=1;                    }                    else                    {                       /* if(k!=0)                        {                            a[i][k+1]=a[j][k+1]=1;                            break;                        }                        else */break;                    }                    k++;                }                // int tmp=kmp(str[i],str[j],a[i],a[j]);                //tmp=tmp==1?tmp:tmp*2;                //maxx=max(maxx,tmp);                //printf("%d ",maxx);                //sum+=maxx;            }        }        for(i=0; i<n; i++)            for(j=0; j<str[i].length(); j++)            {                sum+=a[i][j];            }        printf("%d\n",sum);    }    return 0;}

0 0
原创粉丝点击