[NKU]sweet @ Google && TopCoder && CodeForces

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  33 Posts :: 1 Stories :: 15 Comments :: 0 Trackbacks

再次介绍我自己,OI界摸爬滚打5年半的老菜鸟,ACM/ICPC摸爬滚打半年的09级新人……
为啥转移到了javablog呢?
今后争取把主语言转为java……
不过这里的代码不见得都是java,毕竟ICPC题,java的IO还是很吃亏的,TC争取都java……

今天写计算机科学概论论文,顺道写了个题:SPOJ 21

    给出n条记录(n<=100000),形如 03 10103538 2222 1233 6160 0142
    要求将它们按字典序排序,并且统计每组记录的出现次数
    例如:
    6
    03 10103538 2222 1233 6160 0142
    03 10103538 2222 1233 6160 0141
    30 10103538 2222 1233 6160 0141
    30 10103538 2222 1233 6160 0142
    30 10103538 2222 1233 6160 0141
    30 10103538 2222 1233 6160 0142
    输出:
    03 10103538 2222 1233 6160 0141 1
    03 10103538 2222 1233 6160 0142 1
    30 10103538 2222 1233 6160 0141 2
    30 10103538 2222 1233 6160 0142 2

算法:10000为基的基数排序+10000的计数排序

复杂度O(N)

  1 #include <cstdio>
  2 #include <cstring>
  3 
  4 inline int nextInt()
  5 {
  6     int ans=0;
  7     for (;;)
  8     {
  9         char c=getchar();
 10         if (c<'0'||c>'9')
 11             break;
 12         ans=(ans<<3)+(ans<<1)+c-'0';
 13     }
 14     return ans;
 15 }
 16 
 17 struct node
 18 {
 19     int key[7];
 20 };
 21 bool operator ==(node a,node b)
 22 {
 23     for (int i=0;i<7;i++)
 24         if (a.key[i]!=b.key[i])
 25             return 0;
 26     return 1;
 27 }
 28 
 29 inline void nextNode(node &ans)
 30 {
 31     ans.key[0]=nextInt();
 32     int tmp=0;
 33     for (int i=0;i<4;i++)
 34     {
 35         char c=getchar();
 36         tmp=(tmp<<3)+(tmp<<1)+c-'0';
 37     }
 38     ans.key[1]=tmp;
 39     for (int i=2;i<7;i++)
 40         ans.key[i]=nextInt();
 41     getchar();
 42 }
 43 
 44 node arr[100010];
 45 
 46 int cnt[10010];
 47 int n;
 48 int arr1[100010];
 49 int arr2[100010];
 50 int *now;
 51 int *sorted;
 52 
 53 int KEY[100010];
 54 
 55 void mysort(int s)
 56 {
 57     memset(cnt,0,sizeof(cnt));
 58     for (int i=0;i<n;i++)
 59         KEY[i]=arr[now[i]].key[s];
 60     for (int i=0;i<n;i++)
 61         cnt[KEY[i]]++;
 62     for (int i=1;i<=10000;i++)
 63         cnt[i]+=cnt[i-1];
 64     for (int i=n-1;i>=0;i--)
 65         sorted[--cnt[KEY[i]]]=now[i];
 66 }
 67 
 68 void printNode(node a)
 69 {
 70     printf("%02d ",a.key[0]);
 71     printf("%04d%04d",a.key[1],a.key[2]);
 72     for (int i=3;i<7;i++)
 73         printf(" %04d",a.key[i]);
 74 }
 75 
 76 int main()
 77 {
 78     int nn=nextInt();
 79     while (nn--)
 80     {
 81         n=nextInt();
 82         now=arr1;
 83         sorted=arr2;
 84         for (int i=0;i<n;i++)
 85         {
 86             nextNode(arr[i]);
 87             now[i]=i;
 88         }       
 89         for (int i=6;i>=0;i--)
 90         {
 91             mysort(i);
 92             int *tmp=now;
 93             now=sorted;
 94             sorted=tmp;
 95         }
 96         for (int i=0,j=i;i<n;i=j)
 97         {
 98             node Now=arr[now[i]];
 99             int cnt=0;
100             for (;Now==arr[now[j]];j++,cnt++);
101             printNode(arr[now[i]]);
102             printf(" %d\n",cnt);
103         }
104         if (nn) putchar(10);
105         getchar();
106     }
107     return 0;
108 }
posted on 2010-02-21 18:05 sweetsc 阅读(126) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: