第一次RE,数组定义的太小了,题目说是5000个单词,如果加上重复的就不够了。
第二次TLE,我用的是选择排序,应该用快排。
快排函数:
用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));
参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针,用于确定排序的顺序
qsort 的函数原型是void __cdecl qsort ( void *base, size_t num, size_t width, int (__cdecl *comp)(const void *, const void* ) )
其中base是排序的一个集合数组,num是这个数组元素的个数,width是一个元素的大小,comp是一个比较函数。
比如:对一个长为1000的数组进行排序时,int a[1000]; 那么base应为a,num应为 1000,width应为 sizeof(int),comp函数随自己的命名。
qsort(a,1000,sizeof(int ),comp);
其中comp函数应写为:
int comp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
上面是由小到大排序,return *(int *)b-*(int *)a; 为由大到小排序。
AC代码如下:
1 #include<stdio.h> 2 #include<string.h> 3 4 char sin[100010][205]={{0},{0}}, sout[100010][205]={{0},{0}}, str[205]; 5 6 void strlwer(char str[]) 7 { 8 int i; 9 for (i=0; str[i] != '\0'; i++) 10 if (str[i] >= 'A' && str[i] <= 'Z') 11 str[i]+=32; 12 } 13 14 int cmp(const void* _a,const void* _b) 15 { 16 char* a= (char*)_a; 17 char* b= (char*)_b; 18 return strcmp(a,b); 19 20 } 21 22 int main() 23 { 24 int i, j, k, l; 25 l=0; 26 for (k=0; gets(sin[k]); k++) 27 { 28 strlwer(sin[k]); 29 for (i=0; i<strlen(sin[k]); i++) 30 { 31 if (sin[k][i] >= 'a' && sin[k][i] <='z') 32 { 33 for (j=i; ; j++) 34 { 35 if (sin[k][j] >= 'a' && sin[k][j] <= 'z') 36 { 37 sout[l][j-i]=sin[k][j]; 38 } 39 else 40 { 41 sout[l][j-i]='\0'; 42 l++; 43 i=j; 44 break; 45 } 46 } 47 } 48 } 49 } 50 qsort(sout, l, sizeof(sout[0]), cmp); 51 for (i=0; i<l; i++) 52 { 53 if (strcmp(sout[i], sout[i+1])!=0) 54 puts(sout[i]); 55 } 56 return 0; 57 }