[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 閱讀(133) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 舟曲县| 吉林省| 鹤壁市| 腾冲县| 白水县| 隆回县| 鄂温| 滁州市| 米林县| 常山县| 阳山县| 巧家县| 襄垣县| 河东区| 阿荣旗| 舒兰市| 辛集市| 山西省| 通榆县| 论坛| 白银市| 清苑县| 金秀| 习水县| 莲花县| 张北县| 盈江县| 中山市| 鸡西市| 呼图壁县| 高陵县| 安化县| 喀喇| 固始县| 融水| 阿拉善左旗| 保亭| 通许县| 陆川县| 苍梧县| 丁青县|