命令提示OJ Problem 566

来源:互联网 发布:甲骨文java培训骗局 编辑:程序博客网 时间:2024/06/05 05:49
命令提示
运行时限: 1000 ms   内存限制: 256 MB
总提交: 251次   通过: 57次

题目描述

用过linux的shell的同学都知道,如果敲命令敲了一半,可以按Tab键进行自动补全(条件是已经敲的字符串是字典里的某个字符串前缀)。
当然如果有多个候选项,那么就不会补全。这种情况下,你多按几次,shell会把所有的候选项都显示出来。

现在要求简易模拟shell的补全,简便起见,只敲一个命令(没有空格隔开的多个命令之类的),并对它进行补全处理。
现在给你一个字典,和已经敲的命令,请输出候选项,没有候选项则输出null。

程序输入说明

第一行包含一个正整数T (T<20)表示有多少组测试数据,每组测试数据第一行包括2个整数M,N(0<M,N<10000),分别代表字典大小,测试命令数。第二行包含M个以空格隔开的字符串(字符串长度 < 30),表示字典内容。第三行包括N个待补全的命令字符串,用空格隔开。

程序输出说明

每组测试数据输出:每个测试项的测试结果。
每个测试项一行,命令之间用空格隔开(按照字典序排序)。
具体格式参照样例。

程序输入样例

可见格式带空格和换行符的格式带空格和换行符的格式说明
51 1aa1 1ac3 1ls ll lnl5 2abcde abcd abc ab aqwer abc5 2abce abcd abc ab aqwer abcd


程序输出样例

OriginalTransformed带空格和换行符的格式说明
Case 1:aCase 2:nullCase 3:ll ln lsCase 4:nullabc abcd abcdeCase 5:nullabcd

提示

题目来源

小兔齐齐

[统计数据]     [提 交]

个人理解:

就是字符串匹配 但是都是在首位置就匹配
另外字典序用快排的时候
我直接用的指针

AC情况:


代码GCC C:

# include <stdio.h># include <string.h># define M 10000# define N 31int BF(char a[],char b[]);void Qsort(int L,int R);char A[M][N],B[M][N],*tt[M],*W;int main(){    int T,m,n,i,j,k,t=0,C[M];    //freopen("AAA.txt","r",stdin);    scanf("%d",&T);    while(T--)    {        scanf("%d %d",&m,&n);        for(i=0;i<m;i++)        {            tt[i]=A[i];            scanf("%s",A[i]);        }        Qsort(0,m-1);        printf("Case %d:\n",++t);        for(i=0;i<n;i++)        {            scanf("%s",B[i]);            for(k=j=0;j<m;j++)                if(BF(tt[j],B[i]))                   C[k++]=j;            if(!k)printf("null");            else            {              for(j=0;j<k-1;j++)                printf("%s ",tt[C[j]]);              printf("%s",tt[C[j]]);            }            printf("\n");        }     }    return 0;}int BF(char a[],char b[])//BF算法 a为主串,b为被检验的串{                          int i=0,j=0;      while (a[i]&&b[j])     if    (a[i++]==b[j])++j;   // 继续比较后继字     else   (i-=j)&&(j=0);              return !b[j]&&(i==j);    }  void Qsort(int L,int R)//快速排序 升序     {        int i=L,j=R;      char *temp=tt[L];       if(L>R)  return;        while(i!=j) //当数组左右两边没相遇        {            while(strcmp(tt[j],temp)>=0&&i<j)j--;         while(strcmp(tt[i],temp)<=0&&i<j)i++;             if(i<j){ W=tt[i];tt[i]=tt[j];tt[j]=W;}       }        if(L!=i) { W=tt[i];tt[i]=tt[L];tt[L]=W;}    Qsort(L,i-1);         //递归左        Qsort(i+1,R);         //递归右    }


原创粉丝点击