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 }

 

posted on 2012-10-13 04:15  acmer_acm  阅读(181)  评论(0编辑  收藏  举报