hdu 1800 字符串水题 可用字符串hash 字典树做 我用了最水的排序水过
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1800
题意 输入n表示n个人 然后每个人有一个能力值。。大能力值的能教小能力值的。小的又能教更小的。这样就形成的一条链。相同的不能互相教。问这样的链最少为几条。。输入能力值为不超过30位的数
解析 每个大的总可以带走一条比它小的没有重复数字的链。。那
比如 1 1 2 1 2 3 4 第一波带走4321 第二波21 三1 四 1
通过这样我们发现连续的串一次只能带走一个。。那我们不是只要求出现最多的串就是答案了
方法
开始想法用字典树每个能力值分解成字符加入字典树中看哪个最多。速度较快。
而后想到了直接排序直接求的最大相同区间
献上ac代码
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 int cam(const void *x,const void *y) 6 { 7 return strcmp((char *)y,(char *)x); 8 } 9 int main() 10 { 11 char a[3005][35]; 12 int vis[3005]; 13 int n; 14 while(scanf("%d",&n)!=EOF) 15 { 16 memset(vis,0,sizeof(vis)); 17 int i, j; 18 for(i=1;i<=n;i++) 19 { 20 scanf("%s",a[i]); 21 for(j=0;a[i][j]!='\0';j++) 22 { 23 if(a[i][j]!='0') 24 break; 25 } 26 int temp = j; 27 for(;a[i][j]!='\0';j++) 28 { 29 a[i][j-temp]=a[i][j]; 30 } 31 a[i][j-temp]='\0'; 32 } 33 34 int count = 0; 35 qsort(&a[1],n,sizeof(a[1]),cam); 36 37 int max=1; 38 count = 1; 39 for(i=2;i<=n;i++) 40 { 41 if(strcmp(a[i],a[i-1])==0) 42 count++; 43 else 44 count=1; 45 if(count>max) 46 max=count; 47 48 } 49 50 printf("%d\n",max); 51 52 } 53 return 0; 54 }