| ||||||||||
| 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