UVa 123 快速查找

/*

* 解题思路:

* 题目大意就是先给出一些单词,这些单词是不重要的,再给出一些句子,将句子中除去先前输入的不重要的单词其余单词存到一个数组中(单词不重复),排序,

*      按字典序,将重要单词数组中从第一个单词开始,分别到先前输入的句子数组中找,如果该句子中有该单词,输出该单词(除该单词大写外其他单词均小写)

*      如果一个句子中有多个该单词,则按输出例句

			a MAN is a man but bubblesort is a dog 
			a man is a MAN but bubblesort is a dog 

*     这样从左到右输出该重点单词即可

*      题目没有陷阱,按题目Sample输出即可

*/



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
char s1[ 55 ][ 11 ],s2[ 205 ][ 100 ];
char s3[ 10005 ][ 20 ];
int p,q,r;
int cmp( const void *_a , const void *_b )
{
    char *a = (char *)_a;
    char *b = (char *)_b;
    return strcmp( a , b );
}
void Paint( int x , char temp[ ] ,int y ,int z )
{
    int i;
    for( i=0;i<z;i++ )
        printf("%c",tolower( s2[ x ][ i ] ) );
    for( i=0;i<y;i++ )
        printf("%c",toupper( temp[ i ] ) );
    for( i=z+y;i<strlen( s2[ x ] ) ;i++ )
        printf("%c",tolower( s2[ x ][ i ] ) );
    puts("");
}
void Find( int x )
{
    int i,j,k;
    char temp[ 20 ];

    for( i=0;i<q;i++ )
    {
        j = 0;
       while( j<strlen( s2[ i ] ) )
       {
            k = 0;
            while( s2[ i ][ j ] != ' ' &&  j<strlen( s2[ i ] ) )
                   temp[ k++ ] = tolower( s2[ i ][ j++ ] );
            temp[ k ] = '\0';
            if( strcmp( s3[ x ] , temp ) == 0 )
                Paint( i , temp , k , j-k );
            j++;
       }
    }
}
void search( int x )
{
    int i,j,k,o;
    int flag;
    char temp[ 20 ];

    j = 0;
    while( j< strlen( s2[ x ] ) )
    {
        k = 0;
        while( s2[ x ][ j ] != ' ' && j < strlen( s2[ x ] ) )
            temp[ k++ ] = tolower( s2[ x ][ j++ ] );
        temp[ k ] = '\0';
        flag = 0;
        for( i=0;i<p;i++)
            if( strcmp( s1[ i ] , temp ) == 0 )
            {
                flag = 1;
                break;
            } 
        
        if( !flag ) 
        {   
            flag = 0;
            for( o=0;o<r;o++ )
                if( strcmp( s3[ o ] , temp ) == 0 )
                {
                    flag = 1;
                    break;
                }
            if( !flag )
                strcpy( s3[ r++ ] , temp ); 
        }
        j++;
    }
}
int main( )
{
    int i,j;
    char c;

    p = 0;
    while( scanf("%s",&s1[ p ] ) && s1[ p ][ 0 ] != ':' ) p++;
    getchar( );
    q = 0;
    while(( c = getchar( ) ) != EOF )
    {
        i = 0;
        while( c!='\n' )
        {
            s2[ q ][ i++ ] = c;
            c = getchar( );
        }
        s2[ q ][ i ] = '\0';
        q++;
    }

    r = 0;
    for( i=0;i<q;i++ )
        search( i );

    qsort( s3 , r , sizeof( s3[ 0 ] ) , cmp );

    for( j=0;j<r;j++ )
        Find( j );

    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值