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;
}


UVa 10115 自动编辑

上一篇:C# 实践 4 using 关键字


下一篇:题目1191:矩阵最大值