『acm』 程序错再哪?我测试了下输入10w个 要3分钟的样子,怎么不给个timelimit
程序代码://---------------------------------------------------------------------------------------------------------
//解题步骤:
// 1,每输入一个合法的字符串,就转换成标准格式
// 2,把格式后的字符串,插入链表
//insert函数工作步骤:
// 1,判断是否为第一次插入,是则直接插入
// 2,维护一个递增链表。
// 3,遍历链表,比较t与结点数据域的大小,来决定互换
// 4,遍历结束,把最大的元素保存到t,在插入表尾
//---------------------------------------------------------------------------------------------------------
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include <time.h> //测试程序而添加的头
typedef struct lnode
{
char data[9];
int counter;
struct lnode *next;
}lnode,*linklist;
void changetostande(char*,char*);
int insert(linklist,char* );
int main()
{
linklist lodeptr,p;
lnode codelode;
long i;
int j;
char t[9],s[256];
codelode.next=0;
p=lodeptr=&codelode;
scanf("%d",&i);
if (i>100000) return 0;
while (i--)
{ int j=0;
while (j<8)
{
s[j++]= (char)((rand()%10)+48);////测试程序而添加的
}
changetostande(s,t);//转换成标准格式 ***-****
//printf("%s\n",t);
j=insert(lodeptr,t);//在插入链表
}
if (!j)
{
printf("%s\n","No duplicates.");
}
while (p->next)
{
p=p->next;
printf("%s %d\n",p->data,p->counter);
}
return 0;
}
int insert(linklist lodeptr,char *t)
{
linklist p,q,r;
int i=0;
static int n=0 ,j=0;
char max1[9];
p=lodeptr->next;
if (!n)//第一次时,直接插入
{
n=1;
q=malloc(sizeof(lnode));
q->next=lodeptr->next;
q->counter=0;
strcpy(q->data,t);
lodeptr->next=q;
return 0;
}
else
while (p)//否则遍历链表
{
i=strcmp(t,p->data);
if (i==0)
{
p->counter++;
return j=1;
}
else if(i==1)
{
r=p;
p=p->next;
}
else
{
strcpy(max1,p->data);
strcpy(p->data,t);
strcpy(t,max1);
r=p;
p=p->next;
}
}//while 维护一个递增链表把最大的换出来
q=malloc(sizeof(lnode));
strcpy(q->data,t);
q->counter=0;
q->next=r->next;
r->next=q;//再插到表尾
return j;
}
void changetostande(char* s,char* t)
{//这玩意就没改了,本来想换个比较"0000 1111 2ABC 3DEF 4GHI 5JKL 6NMO 7PRS 8TUV 9WXY",实现功能的。
int n=0;
while (*s && n<8)
{
if (n==3)
{
*(t++)='-';
n++;
*(s--);
}
else
{
switch (*s)
{
case 'A':
case 'B':
case 'C':
case '2': ++n;
*(t++)='2';
break;
case 'D':
case 'E':
case 'F':
case '3': ++n;
*(t++)='3';
break;
case 'G':
case 'H':
case 'I':
case '4': ++n;
*(t++)='4';
break;
case 'J':
case 'K':
case 'L':
case '5': ++n;
*(t++)='5';
break;
case 'N':
case 'M':
case 'O':
case '6': ++n;
*(t++)='6';
break;
case 'P':
case 'R':
case 'S':
case '7': ++n;
*(t++)='7';
break;
case 'T':
case 'U':
case 'V':
case '8': ++n;
*(t++)='8';
break;
case 'W':
case 'X':
case 'Y':
case '9': ++n;
*(t++)='9';
break;
case '0': ++n;
*(t++)='0';
break;
case '1': ++n;
*(t++)='1';
break;
default:
break;
}//switch
}//if
*(s++);
}//while
*t=0;
}
第一次测试,就这么悲惨。。







