int main() { FILE *in , *out; in = fopen("invertsub.in","r"); out = fopen("invertsub.out","w"); fgets(text+1,max_length,in); fgets(pattern+1,max_length,in); n = strlen(text+1); m = strlen(pattern+1); pattern[m--] = '\0'; text[n--] = '\0'; compute_next(); int i=1,j=1; while(i <= n && j <= m){ while( j > 0 && pattern[j] != text[i]) j = next[j]; i++,j++; } if(i > n && j <= m) { fprintf(out,"searching failed"); return -1; } int k; for(k = 0; k < m ; k++){ text[i-m+k] = pattern[m-k]; } fprintf(out,"%s\n",text+1); return 0; }
Lexer::Lexer( std::string&& str ) : _file( new std::string(std::move(str)) ) { init(); position_iterator<std::string::iterator> iter( _file->begin() ); position_iterator<std::string::iterator> end( _file->end() ); _results = lexertl::match_results<decltype(iter)>( iter, end ); compute_next(); }
/* Rückgabe 0 sonst */ int bounded_sequence(complex *c) { int i; double condition; complex z; z.re = 0; z.im = 0; for (i = 0; i < 301; i++) { compute_next(&z, c); condition = z.re * z.re + z.im * z.im; if (condition > 4) { return 0; } } return 1; }
Lexer::Lexer( const char * filename ) : _file( new std::string ) { init(); std::ifstream in( filename, std::ios::in ); if( !in ) throw file_error("Error reading file"); in.seekg( 0, std::ios::end ); _file->resize( in.tellg() ); in.seekg( 0, std::ios::beg ); in.read( &(*_file)[0], _file->size() ); in.close(); position_iterator<std::string::iterator> iter( _file->begin() ); position_iterator<std::string::iterator> end( _file->end() ); _results = lexertl::match_results<decltype(iter)>( iter, end ); compute_next(); }
void kmp_strall(char *t, char *p) { int lt = strlen(t); int lp = strlen(p); int i = 0, j = 0; int next[lp]; compute_next(p, next); while (i < lt) { if (j == -1 || t[i] == p[j]) { i++; j++; } else { j = next[j]; } if (j == lp) { printf("kmp: find match at %d\n", i - j); j = 0; } } }
int kmp_strstr(char *t, char *p) { int lt = strlen(t); int lp = strlen(p); int i = 0, j = 0; int next[lp]; compute_next(p, next); while (i < lt && j < lp) { if (j == -1 || t[i] == p[j]) { i++; j++; } else { j = next[j]; } } if (j == lp) return i - j; else return -1; }
const Statement * Parser::peek() { if( !_next ) compute_next(); return _next.get(); }
std::unique_ptr<Statement> Parser::next() { if( !_next ) compute_next(); return std::move(_next); }