Пример #1
0
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;
}
Пример #2
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();
}
Пример #3
0
                                         /* 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;
}
Пример #4
0
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();
}
Пример #5
0
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;
		}
	}
}
Пример #6
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;
}
Пример #7
0
const Statement * Parser::peek() {
    if( !_next )
        compute_next();
    return _next.get();
}
Пример #8
0
std::unique_ptr<Statement> Parser::next() {
    if( !_next )
        compute_next();
    return std::move(_next);
}