/*
* 解题思路:
* 题意虽不难理解、但一定要读清楚!
* 它匹配过程中、是允许一个字符串重复匹配上一个字符串的、就好比说例子 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;
}
原文:http://blog.csdn.net/u011886588/article/details/18861375