CSU1115——最短的名字
来源:互联网 发布:java二分法查找 编辑:程序博客网 时间:2024/06/14 01:06
在一个奇怪的村子中,很多人的名字都很长,比如aaaaa, bbb and abababab。
名字这么长,叫全名显然起来很不方便。所以村民之间一般只叫名字的前缀。比如叫'aaaaa'的时候可以只叫'aaa',因为没有第二个人名字的前三个字母是'aaa'。不过你不能叫'a',因为有两个人的名字都以'a'开头。村里的人都很聪明,他们总是用最短的称呼叫人。输入保证村里不会有一个人的名字是另外一个人名字的前缀(作为推论,任意两个人的名字都不会相同)。
如果村里的某个人要叫所有人的名字(包括他自己),他一共会说多少个字母?
输入第一行为数据组数T (T<=10)。每组数据第一行为一个整数n(1<=n<=1000),即村里的人数。以下n行每行为一个人的名字(仅有小写字母组成)。输入保证一个村里所有人名字的长度之和不超过1,000,000。
对于每组数据,输出所有人名字的字母总数。
13aaaaabbbabababab
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
- CSU1115——最短的名字
- CSU1115 最短的名字
- CSU1115-最短的名字
- CSU1115 最短的名字 题解
- csu1115(字典树)最短的名字
- csu1115 最短的名字 字典树模板
- 最短的名字
- 最短的名字
- 最短的名字
- 最短的名字
- 最短的名字
- 最短的名字
- 最短的名字
- 最短的名字
- 最短的名字
- 最短的名字(湖南省赛 最短的名字)
- E - 最短的名字
- 1115: 最短的名字
- iOS UILabel UIButton UIImageView使用方法
- java之xml解析
- Redis Sentinel机制与用法(一)
- Struts2的<s:date >标签格式化时间
- jsp分页
- CSU1115——最短的名字
- Android App开发基础篇—HttpURLConnection基础使用
- iOS开发中内置浏览器
- matlab2012b与VS2012混编总结(4)——配置VS2012工作环境
- 欢迎使用CSDN-markdown编辑器
- elasticsearch源码分析之Rest/RPC 接口解析(八)
- selenium+testNG+maven
- 数组之Next Permutation---leetcode
- 用matlab 保存带标记图像、图片的方法总结