withdfa.cpp

来自「多种字符串匹配算法 多种字符串匹配算法」· C++ 代码 · 共 66 行

CPP
66
字号
// withDFA.cpp: implementation of the withDFA class.
//
//////////////////////////////////////////////////////////////////////

#include "withDFA.h"
#include <string.h>

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

withDFA::withDFA()
{}

withDFA::~withDFA()
{}


void withDFA::test()
{
	TimeIt tt;
	withDFA dfa;
	dfa.search();
	dfa.OUTPUT(tt.GetMSecElapsed());
}

void withDFA::preAut(char *x, int m, Graph* aut) 
{
	int i, state, target, oldTarget;

	for (state = aut->getInitial(), i = 0; i < m; ++i) {
		oldTarget = aut->getTarget(state, x[i]);
		target = aut->newVertex();
		aut->setTarget(state, x[i], target);
		aut->copyVertex(target, oldTarget);
		state = target;
	}
	aut->setTerminal(state);
}
 

// 2006-02-13 dx
#define ASIZE		5
 
void withDFA::search() 
{
	char *x = (char*)m_search,
		 *y = (char*)m_context;
	int m = strlen(m_search), 
		n = strlen(m_context);

	int j, state;
	Graph* aut;

	/* Preprocessing */
	aut = Graph::newAutomaton(m + 1, (m + 1)*ASIZE);
	preAut(x, m, aut);

	/* Searching */
	for (state = aut->getInitial(), j = 0; j < n; ++j) {
		state = aut->getTarget(state, y[j]);
		if (aut->isTerminal(state))
			OUTPUT(j - m + 1);
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?