一、基数排序。

题目描述:给你n个字符串,把它们排序。  n<=100000  (不要用sort水过,除非你在NOI的考场上)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<cmath>
 6 #include<ctime>
 7 #include<algorithm>
 8 #define MAXN 100010
 9 using namespace std;
10 int n,rank[MAXN],p[MAXN],sa[MAXN],cnt[MAXN];
11 char s[MAXN][15];
12 inline int read()
13 {
14     int x=0,f=1;  char ch=getchar();
15     while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getchar();}
16     while(isdigit(ch))  {x=x*10+ch-'0';  ch=getchar();}
17     return x*f;
18 }
19 void Init()
20 {
21     n=read();
22     for(int i=1;i<=n;i++)
23     {
24         char ch[15];
25         scanf("%s",ch);
26         for(int j=1;j<=10;j++)
27             s[i][j]=j>strlen(ch)?'a'-1:ch[j-1];
28     }
29 }
30 void Radix_sort()
31 {
32     for(int i=1;i<=n;i++)  sa[i]=i;
33     for(int l=10;l>0;l--)
34     {
35         for(int i=1;i<=n;i++)  rank[i]=s[i][l]-'a'+1,p[i]=sa[i];
36         for(int i=0;i<=26;i++)  cnt[i]=0;
37         for(int i=1;i<=n;i++)  cnt[rank[i]]++;
38         for(int i=1;i<=26;i++)  cnt[i]+=cnt[i-1];
39         for(int i=n;i>=1;i--)  sa[cnt[rank[p[i]]]--]=p[i];
40     }
41 }
42 void print()
43 {
44     for(int i=1;i<=n;i++)
45         printf("%d ",sa[i]);
46 }
47 int main()
48 {
49     Init();
50     Radix_sort();
51     print();
52     return 0;
53 }
View Code

相关文章: