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

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            33 Posts :: 1 Stories :: 15 Comments :: 0 Trackbacks

          再次介紹我自己,OI界摸爬滾打5年半的老菜鳥,ACM/ICPC摸爬滾打半年的09級(jí)新人……
          為啥轉(zhuǎn)移到了javablog呢?
          今后爭(zhēng)取把主語(yǔ)言轉(zhuǎn)為java……
          不過這里的代碼不見得都是java,畢竟ICPC題,java的IO還是很吃虧的,TC爭(zhēng)取都java……

          今天寫計(jì)算機(jī)科學(xué)概論論文,順道寫了個(gè)題:SPOJ 21

              給出n條記錄(n<=100000),形如 03 10103538 2222 1233 6160 0142
              要求將它們按字典序排序,并且統(tǒng)計(jì)每組記錄的出現(xiàn)次數(shù)
              例如:
              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為基的基數(shù)排序+10000的計(jì)數(shù)排序

          復(fù)雜度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 閱讀(144) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 府谷县| 枝江市| 南木林县| 淮南市| 乌鲁木齐市| 河东区| 长武县| 关岭| 安仁县| 湟源县| 西宁市| 驻马店市| 玉林市| 平定县| 乐亭县| 甘谷县| 澳门| 且末县| 花垣县| 六枝特区| 武功县| 灵石县| 武威市| 蕉岭县| 牡丹江市| 张家川| 宜良县| 五大连池市| 阿巴嘎旗| 桃园市| 即墨市| 明光市| 邯郸县| 弋阳县| 沾益县| 收藏| 铁岭市| 前郭尔| 大丰市| 红原县| 甘德县|