Go to diff to previous submission
#include <stdio.h> #include <stdlib.h> #include <string> #include <iostream> #include <string.h> using namespace std; int myFind ( int lastPos, int length, char * line, char * text, bool *& erased, bool & count ) { int k = 0; int text_length = (int) strlen (text); int g; bool toErase = true; for ( int i = lastPos; i < length - text_length; i++ ) { if ( erased[i] == false && line[i] == text[0] ) { k = 1; g = i + 1; for ( int j = i + 1; j < i + text_length; j++ ) { while ( erased[g] ) g++; if ( g >= length || line[g] != text[k++] ) { toErase = false; break; } g++; } if ( toErase ) { k = i; for ( int z = i; z < i + text_length; z++ ) { while ( erased[k] ) k++; erased[k] = true; } count = true; return i; } toErase = true; } } return -1; } void analyseLine ( char * text, char * line, bool * erased ) { int length = (int) strlen(line); int text_length = (int) strlen (text); int lastPos = 0; bool count = false; if ( !length ) { cout << endl; return; } while ( 1 ) { lastPos = myFind ( lastPos, length, line, text, erased, count ); if ( lastPos == -1 ) break; lastPos = (int)lastPos - text_length + 1 >= 0 ? lastPos - text_length + 1 : 0; } if ( !count ) cout << line << endl; else { for ( int i = 0; i < length; i++ ) { if ( !erased[i] ) cout << line[i]; } cout << endl; } } int main ( void ) { int n, i, j; char tmp; bool * erased = new bool[2000100]; char * text = new char[1010]; char * line = new char[2000100]; while ( scanf ( "%d %s%c", &n, text, &tmp ) == 3 ) { for ( i = 0; i < n; i++ ) { gets ( line ); for ( j = 0; j < (int)strlen (line); j++ ) erased[j] = false; analyseLine ( text, line, erased ); } } delete [] erased; delete [] text; delete [] line; return 0; }
--- c4.s915.cteam019.bugs.cpp.0.bugs.cpp +++ c4.s945.cteam019.bugs.cpp.0.bugs.cpp @@ -3,13 +3,15 @@ #include <string> #include <iostream> +#include <string.h> using namespace std; -int myFind ( int lastPos, int length, string & line, string & text, bool *& erased, bool & count ) +int myFind ( int lastPos, int length, char * line, char * text, bool *& erased, bool & count ) { int k = 0; + int text_length = (int) strlen (text); int g; bool toErase = true; - for ( int i = lastPos; i < (int)(length - text.length()); i++ ) + for ( int i = lastPos; i < length - text_length; i++ ) { if ( erased[i] == false && line[i] == text[0] ) @@ -17,5 +19,5 @@ k = 1; g = i + 1; - for ( int j = i + 1; j < (int)(i + text.length()); j++ ) + for ( int j = i + 1; j < i + text_length; j++ ) { while ( erased[g] ) @@ -31,5 +33,5 @@ { k = i; - for ( int z = i; z < i + (int)text.length(); z++ ) + for ( int z = i; z < i + text_length; z++ ) { while ( erased[k] ) @@ -46,7 +48,8 @@ } -void analyseLine ( string & text, string & line, bool * erased ) +void analyseLine ( char * text, char * line, bool * erased ) { - int length = (int) line.length(); + int length = (int) strlen(line); + int text_length = (int) strlen (text); int lastPos = 0; bool count = false; @@ -61,5 +64,5 @@ if ( lastPos == -1 ) break; - lastPos = (int)lastPos - text.length() + 1 >= 0 ? lastPos - (int)text.length() + 1 : 0; + lastPos = (int)lastPos - text_length + 1 >= 0 ? lastPos - text_length + 1 : 0; } if ( !count ) @@ -79,16 +82,15 @@ { int n, i, j; - char bug[1010]; char tmp; bool * erased = new bool[2000100]; - string text, line; + char * text = new char[1010]; + char * line = new char[2000100]; - while ( scanf ( "%d %s%c", &n, bug, &tmp ) == 3 ) + while ( scanf ( "%d %s%c", &n, text, &tmp ) == 3 ) { - text = string ( bug ); for ( i = 0; i < n; i++ ) { - getline ( cin, line ); - for ( j = 0; j < (int)line.length(); j++ ) + gets ( line ); + for ( j = 0; j < (int)strlen (line); j++ ) erased[j] = false; analyseLine ( text, line, erased ); @@ -97,4 +99,6 @@ delete [] erased; + delete [] text; + delete [] line; return 0; }