Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
请用字典树In Reply To:各位,我是新手,请指教:用的堆排,为什么总是超时……该怎么改,难道非用快排不可么 Posted by:lhyan792 at 2010-04-02 12:35:12 > #include<stdio.h> > struct stat > { > char s[10]; > long int num; > }; > char a1[1000001][20]; > char b1[1000001][10]; > long int num1[1000001]; > struct stat st1[1000001]; > int exchange(struct stat *a,struct stat *b) //交互 > { > struct stat c; > c=*a; > *a=*b; > *b=c; > return 0; > } > int mini(char *a,char *b) //比较字符串大小的子函数 > { > long int i; > long int j; > for(i=0;i<=7;i++) > { > if(a[i]<b[i]) > { > j=1; > break; > } > else if(a[i]>b[i]) > { > j=0; > break; > } > } > return j; > } > int sort(struct stat *a,struct stat *b,struct stat *c) //借助交换操作,进行三者排大小,k是用来区分情况的标志 > { > int k=0; > if(mini(a->s,b->s)==0) > { > if(mini(b->s,c->s)==0) > { > exchange(a,c); > k=3; > } > else > { > exchange(a,b); > k=2; > } > } > else if(mini(a->s,c->s)==0) > { > exchange(a,c); > k=3; > } > else k=1; > return k; > } > int change(char *a,char *b) //使字符串规范化XXX-XXXX > { > long int i,j=0; > for(i=0;i<=15;i++) > { > if(a[i]=='\0') > break; > else if(a[i]<=57&&a[i]>=48) > { > if(j==3) > { > b[j]='-'; > i--; > } > else > b[j]=a[i]; > j++; > } > else if(a[i]<=89&&a[i]>=65) > { > if(j==3) > { > b[j]='-'; > i--; > } > else > { > if(a[i]>80) > a[i]=a[i]-1; > b[j]=(a[i]-65)/3+50; > } > j++; > } > > } > return 0; > } > int judge(char *a,char *b) //判断两个字符串是否相同 > { > long int i,j=0; > for(i=0;i<=7;i++) > { > if(a[i]!=b[i]) > break; > } > if(i==8) > return 1; > else > return 0; > } > int sort_s(struct stat *st,int n) //字符串排序 > { > long int i=1; > int k=5; > long int j; > while(n>1) > { > for(i=n/2;i>=1;i--) > { > j=i; > k=5; > if((2*j+1)<=n) > { > while(k!=1&&(2*j<=n)) > { > if(2*j+1<=n) > { > k=sort(&st[j],&st[2*j],&st[2*j+1]); > j=(k/2+1)*j+k%2; > } > else > { > if(mini(st[j].s,st[2*j].s)==0) > { > exchange(&st[j],&st[2*j]); > j=2*j; > } > k=1; > } > } > } > else > { > if(mini(st[j].s,st[2*j].s)==0) > { > exchange(&st[j],&st[2*j]); > j=2*j; > } > } > } > printf("%s",st[1].s); > printf(" %d\n",st[1].num); > exchange(&st[1],&st[n]); > n--; > } > printf("%s",st[1].s); > printf(" %d\n",st[1].num); > return 0; > } > int main() > { > long int i=1,quan=0,k=0,j=1; //i,j,k通用的变量,quan是控制输入号码个数的 > scanf("%d",&quan); > while(j<=quan) //输入 > { > scanf("%s",a1[j]); > j++; > } > j=1; > while(j<=quan) //规范化字符串 > { > change(a1[j],b1[i]); > for(k=1;k<i;k++) > { > if(judge(b1[k],b1[i])==1) > { > num1[k]++; > break; > } > } > if(k==i) > { > num1[i]=1; > i++; > } > j++; > } > k=1; > for(i=1;num1[i]!=0;i++) //装配结构体,同时去除没有重复的号码 > { > if(num1[i]!=1) > { > for(j=0;j<=7;j++) > st1[k].s[j]=b1[i][j]; > st1[k].num=num1[i]; > k++; > } > } > k--; //有重复的号码个数 > if(k==0) > printf("No duplicates.\n"); > else > sort_s(st1,k); //调用字符串排序子程序 > return 0; > } > Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator