UVa 10115 自动编辑

/*

* 解题思路:

* 题意虽不难理解、但一定要读清楚!

*      它匹配过程中、是允许一个字符串重复匹配上一个字符串的、就好比说例子 banana boat , 在bab匹配ban的过程中

*      第一步是 将原字符串变成 babana boat 、第二步是 将第一步产生的字符串变成 bababa boat

*/



#include <stdio.h>
#include <string.h>
#define A 300
int n,p;
char s[ A ][ A ];
char ss1[ A ] , ss2[ A ];
int find( int x ,char a[ ])
{
    int i,j;
    int len1 = strlen( s[ x ] ) , len2 = strlen( a );
    int p;
    for( i=0;i<len2;i++ )
    {
        p = i;
        for( j=0;j<len1;j++ ,p++)
            if( a[ p ] != s[ x ][ j ] )
                break;
        if( j == len1 ) return i;
    }
    return -1;
}
void edit( char a[] , char b[] ,int j ,int pos )
{
    int i,k,p;
    int tmp;
    for( i=0;i<pos;i++ )
        a[ i ] = b[ i ];
    tmp = i;
    for( k = 0; k< strlen( s[ j+1 ] ) ;k++ )
        a[ i++ ] = s[ j+1 ][ k ];
    p = i;
    for( i=tmp+strlen( s[ j ] ) ; i< strlen( b ) ;i++ )
        a[ p++ ] = b[ i ];
    a[ p ] ='\0';
}
int main( )
{
    int i,j,k;
    int pos,flag;
    char c;
    while( scanf("%d",&n) && n )
    {
        getchar( );
        memset(s , '\0' , sizeof( s ) );
        memset( ss1 ,'\0',sizeof( ss1 ) );
        memset( ss2, '\0',sizeof( ss2 ) );
        for( i=0;i<2*n+1;i++,p=0)
                 while(( c = getchar( ) ) !='\n' )
                    s[ i ][ p++ ] = c;
        flag = 1;
        strcpy( ss1 , s[ 2*n ] );
        for( j = 0;j<2*n ; j+=2 )
            while( 1 )
                if( flag == 1 )
                {
                    pos = find( j , ss1 );
                    if( pos == -1 ) break;
                    edit( ss2 , ss1 , j  , pos );
                    flag = 2;
                }
                else if( flag == 2 )
                {
                    pos = find( j , ss2 );
                    if( pos == -1 ) break;
                    edit( ss1 , ss2 , j ,pos );
                    flag = 1;
                }
        flag == 1 ? printf("%s\n",ss1) : printf("%s\n",ss2);
    }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值