亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? nfa-to-dfa.cpp

?? Full support for extended regular expressions (those with intersection and complement); Support for
?? CPP
?? 第 1 頁 / 共 2 頁
字號:

#define NFA_TO_DFA_VERSION "6"

// NFA to DFA conversion library.
// (C) Alexander Okhotin <okhotin@cs.queensu.ca>, 1999-2002.
// (C) Vladimir Prus <ghost@cs.msu.su>, 2000.

#ifdef __BORLANDC__
#define _RWSTD_CONTAINER_BUFFER_SIZE 1024
#endif

static const int _bubble_threshold = 6;

#include <cstddef>
#include <cstdlib>

using namespace std;

#include "dolphin.h"
#include "nfa-to-dfa.h"
#include "nfa-to-dfa-stl.h"
#include "stl.h"

#include <stack>
#include <queue>
#include <fstream>

//#define DFA_DEBUG_EPSILON_CLOSURE
//#define DFA_DEBUG_SUBSET_CONSTRUCTION
//#define DFA_DEBUG_SUBSET_INDEX_LOOKUP
//#define DFA_DEBUG_DEAD_STATES
//#define DFA_THOROUGHLY_DEBUG_DEAD_STATES
//#define DEBUG_DFA_MINIMIZATION


// (AO) The following comment belongs to VP. I don't understand a single word
// in it.

/*	Internal data structures used to speed up convert_nfa_to_dfa
	I belive that the biggest problem is that 1-2 transitions on
	one symbol exists, thus if we proceess each symbol
	individually, STL algorithm call themself can take more time
	then actuall processing
	*/

struct internal_nfa_state
{
	int first_transition, last_transition;
	int first_epsilon_transition, last_epsilon_transition;
	
	internal_nfa_state(int first_transition, int last_transition) :
		first_transition(first_transition),
		last_transition(last_transition)
	{
	}	
};

struct internal_dfa_state
{
	vector<int> nfa_states;
	
	internal_dfa_state() : nfa_states(10) { nfa_states.clear(); }
	static int hash(const internal_dfa_state &ds)
	{
		return accumulate(ds.nfa_states, 0);
	}
	friend bool operator<(const internal_dfa_state &s1, const internal_dfa_state &s2)
	{
		return s1.nfa_states < s2.nfa_states;
	}
	friend bool operator==(const internal_dfa_state &s1, const internal_dfa_state &s2)
	{
		return s1.nfa_states == s2.nfa_states;
	}
};

template<class lookup_structure> struct internal_nfa_dfa
{
	NFA &nfa;
	
//	vector<int> epsilon_transitions;
	lookup_structure cache;
	typedef typename lookup_structure::iterator cache_iterator;
	vector<cache_iterator> dfa_state_aux;
	vector<bool> dfa_accepting;
	
	typedef vector<pair<int, int> > one_state_data;
	typedef vector<pair<int, int> >::iterator one_state_data_iterator;
	
	vector<vector<int> > pred;
	
	vector<bool> accepting_state_is_reachable;
	
	int rejected_states;
	
	internal_nfa_dfa(NFA &nfa);
	void make_epsilon_transitions(NFA &nfa);
	void follow_epsilon(const vector<int> &nfa_states, vector<int> &closure);
	
	int add_dfa_state(vector<int> &nfa_states)
	{
		bool dfa_state_is_accepting(false);
		for(vector<int>::iterator i=nfa_states.begin(); i!=nfa_states.end(); i++)
			if(nfa.states[*i].is_accepting)
			{
				dfa_state_is_accepting = true;
				break;
			}
		
		internal_dfa_state ds;
		ds.nfa_states=nfa_states;
		cache_iterator i=cache.find(ds);
		if(i!=cache.end())
			return i->second;
		else
		{
			pair<cache_iterator, bool> p=cache.insert(make_pair(ds, dfa_state_aux.size()));
			dfa_state_aux.push_back(p.first);
			dfa_accepting.push_back(dfa_state_is_accepting);
			pred.push_back(vector<int>(8));
			pred.back().clear();
			return dfa_state_aux.size()-1;
		}
	}
	const vector<int>& nfa_states_for_dfa_state(int dfa_state)
	{
		return dfa_state_aux[dfa_state]->first.nfa_states;
	}
	void get_dfa_state_data(int dfa_state, one_state_data &osd)
	{
		cache_iterator i=dfa_state_aux[dfa_state];
		for(vector<int>::const_iterator j=i->first.nfa_states.begin(); j!=i->first.nfa_states.end(); j++)
			copy(nfa.states[*j].transitions.begin(), nfa.states[*j].transitions.end(), back_inserter(osd));
		//sort(osd.begin(), osd.end(), greater<pair<int, int> >());
		sort(osd, greater< pair<int, int> >());
		unique_and_erase(osd);
	}
	int get_transitions_for_one_symbol(one_state_data &osd, vector<int> &nstates)
	{
		if(osd.empty()) return -1;
		one_state_data_iterator i=osd.end()-1;
		int sym=i->first;
		while(i->first==sym && i>=osd.begin())
			nstates.push_back((i--)->second);
		i++;
		osd.erase(i, osd.end());
		make_set(nstates);
		return sym;		   
	}
	void mark_accessibility(int dfa_state, int target_state)
	{
		pred[target_state].push_back(dfa_state);
	}
	void find_dead_states()
	{
		// Tells us we have seen this node
		vector<bool> stacked(dfa_accepting);
		// Initial nodes
		vector<int> acc=find_all_indices(stacked, true);
		// Nodes that we've seen but haven't processed yet
		stack<int, vector<int> > s(acc);
		
		while(!s.empty())
		{
			int t=s.top(); s.pop();
			vector<int> &p=pred[t];
			for(vector<int>::iterator i=p.begin(); i!=p.end(); i++)
				if(!stacked[*i])
				{
					stacked[*i]=true;
					s.push(*i);
				}
		}
		accepting_state_is_reachable.swap(stacked);
	}

	// Just the same as partition from 'nfa-to-dfa.h' but uses vectors
	// everywhere. I wanted to retain the original version for
	// testing purposes and redeclared the struct here
	// See comments below for field explanation
	struct Partition
	{
		std::vector<int> state_to_group;
		std::vector<std::vector<int> > groups;
		std::vector<int> group_to_original_group;
		int group_containing_initial_state;

		Partition(const DFA &dfa) : groups(2)
		{
			// 3 initial groups - acc, nonacc and dead(ignored)
			
			vector<bool>::iterator a = dfa.accepting_state_is_reachable.begin();
			for(vector<DFA::State>::const_iterator i=dfa.states.begin(); i!=dfa.states.end(); i++, a++)
			{
				int group_no=(i->is_accepting ? 1 : ((*a) ? 0 : -1));
				// AO: What does _THAT_ mean?
				dfa.state_to_group.push_back;
				if(group_no!=-1)
					dfa.groups[group_no].push_back(distance(dfa.states.begin(), i));
			}		
		}
	};
	void final_fixup(DFA &dfa)
	{
		for(unsigned int i=0; i<dfa_state_aux.size(); i++)
		{
			vector<int> &v=const_cast<vector<int> &>(nfa_states_for_dfa_state(i));
			dfa.states[i].nfa_states.swap(v);
			dfa.states[i].is_accepting=dfa_accepting[i];
		}
		dfa.state_is_live=accepting_state_is_reachable;
	}
	void print_dfa_statistics(DFA &dfa, ostream &os)
	{
		os << "DFA has " << dfa.states.size() << " states\n";
		int count=0;
		for (int i=0; i<pred.size(); i++)
			count+=pred[i].size();
		os << "State has " << fixed << float(count)/pred.size() 
			<< " predecessors on average\n";
	}
};

template<class lookup_structure> internal_nfa_dfa<lookup_structure>::internal_nfa_dfa(NFA &nfa) : nfa(nfa), rejected_states(0)
{
}

template<class lookup_structure> void internal_nfa_dfa<lookup_structure>::make_epsilon_transitions(NFA &nfa)
{
	for(unsigned int s=0; s<nfa.states.size(); s++)
	{
		// Weed out non-important states	
		vector<int>::iterator cur = nfa.states[s].epsilon_transitions.begin(), ins = cur;
		while(cur!=nfa.states[s].epsilon_transitions.end())
		{
			if(nfa.states[*cur].is_important) 
				*ins++=*cur;
			++cur;
		}
		
		if(ins!=nfa.states[s].epsilon_transitions.end())
			nfa.states[s].epsilon_transitions.erase(ins, nfa.states[s].epsilon_transitions.end());
	}
}

template<class lookup_structure> void internal_nfa_dfa<lookup_structure>::follow_epsilon(const vector<int> &current_nfa_states, vector<int> &closure)
{
	for(vector<int>::const_iterator i=current_nfa_states.begin(); i!=current_nfa_states.end(); i++)
	{
		copy(nfa.states[*i].epsilon_transitions.begin(),
			nfa.states[*i].epsilon_transitions.end(),
			back_inserter(closure));
	}
	
	make_set(closure);	  
}

void epsilon_closure(NFA &nfa)
{
	for(unsigned int i=0; i<nfa.states.size(); i++)
	{
		nfa.states[i].epsilon_transitions.push_back(i);
		make_set(nfa.states[i].epsilon_transitions);
	}
	
	bool once_more=true;
	vector<int> more_transitions;
	vector<int> tmp;
	while(once_more)
	{
		once_more=false;
		
		for(unsigned int i=0; i<nfa.states.size(); i++)
		{
			NFA::State &state=nfa.states[i];
			
			more_transitions.clear();
			
			for(vector<int>::iterator p = state.epsilon_transitions.begin(); p != state.epsilon_transitions.end(); ++p)
				copy(nfa.states[*p].epsilon_transitions.begin(), 
					 nfa.states[*p].epsilon_transitions.end(),
					 back_inserter(more_transitions));
			
			make_set(more_transitions);
			
			unsigned int cs=state.epsilon_transitions.size();				
			
			tmp.clear();
			set_union(state.epsilon_transitions.begin(), state.epsilon_transitions.begin(),
				more_transitions.begin(), more_transitions.end(),
				back_inserter(tmp));
			
			state.epsilon_transitions.swap(tmp);
			
			once_more|=(state.epsilon_transitions.size()>cs);
		}
	}

}

void DFA::align_transition_table()
{
	for(int i=0; i<states.size(); i++)
	{
		vector<int> &transitions=states[i].transitions;
		
		while(transitions.size()<number_of_symbols)
			transitions.push_back(-1);
	}
}

#if 0
struct is_not_important : public binary_function<NFA, int, bool>
{
	bool accepting;
	is_not_important() : accepting(false)
	{
	}
	bool operator()(const NFA &nfa, int state)
	{
		accepting|=nfa.states[state].is_accepting;
		return nfa.states[state].is_important==false;
	}
};
#endif

void convert_nfa_to_dfa(NFA &nfa, DFA &dfa)
{
	if(!nfa.states.size()) return;
	
	epsilon_closure(nfa);
	
	internal_nfa_dfa<map<internal_dfa_state, int> > internal(nfa);
	internal.make_epsilon_transitions(nfa);
	
	vector<int> epsilon_scratch;
	
	dfa.number_of_symbols=nfa.number_of_symbols;
	
	DFA::State dstate0;
	
	epsilon_scratch.clear();	
	internal.follow_epsilon(vector<int>(1, 0), epsilon_scratch);
	internal.add_dfa_state(epsilon_scratch);
	
	dfa.states.push_back(dstate0);
	
	map< vector<int>, int > nfa_states_to_dfa_state;
	vector<int> target_nfa_states;
	internal_nfa_dfa< map<internal_dfa_state, int> > :: one_state_data osd;
		
	for(int i=0; i<dfa.states.size(); i++)
	{
		osd.clear();
		internal.get_dfa_state_data(i, osd);

		nfa_states_to_dfa_state.clear();

		while(true)
		{
			target_nfa_states.clear();
			int sym=internal.get_transitions_for_one_symbol(osd, target_nfa_states);
			
			if(sym==0) continue;
			if(sym==-1) break;
			if(target_nfa_states.empty()) continue;
			
			map<vector<int>, int>::iterator s=nfa_states_to_dfa_state.find(target_nfa_states);
			if(s!=nfa_states_to_dfa_state.end())
			{
				dfa.add_transition(i, s->second, sym);
				continue;
			}
			
			epsilon_scratch.clear();
			internal.follow_epsilon(target_nfa_states, epsilon_scratch);
			
			int cs = dfa.states.size();
			int target_state_number=internal.add_dfa_state(epsilon_scratch /*new_index_entry.nfa_states*/);
			if(target_state_number>=cs)
				dfa.states.push_back(DFA::State());
			internal.mark_accessibility(i, target_state_number);
			
			nfa_states_to_dfa_state[target_nfa_states]=target_state_number;
			
			dfa.add_transition(i, target_state_number, sym);
		}	
	}
	
	internal.find_dead_states();
	internal.final_fixup(dfa);
	
	dfa.align_transition_table();
}

// a state is considered dead if either it is unreachable from the initial
// state, or no final state can be reached from it.
// state_is_live[i]==false <==> i-th state is dead.
void DFA::determine_dead_states()
{
	if(state_is_live.size()) state_is_live.clear();
	
#ifdef DFA_DEBUG_DEAD_STATES
	cout << "DFA::determine_dead_states()\n";
#endif
	int n=states.size();
	
	vector<bool> reachable_from_initial, can_lead_to_final;
#ifdef DFA_THOROUGHLY_DEBUG_DEAD_STATES
	cout << "0 is reachable from initial because it IS the initial state.\n";
#endif
	for(int i=0; i<n; i++)
	{
		reachable_from_initial.push_back(i==0);
		can_lead_to_final.push_back(states[i].is_accepting);
	#ifdef DFA_THOROUGHLY_DEBUG_DEAD_STATES
		if(states[i].is_accepting)
			cout << i << " can lead to final because it IS final.\n";

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆swag| 中国av一区二区三区| 久久这里只有精品6| 日韩伦理电影网| 麻豆精品视频在线观看| 91亚洲精品一区二区乱码| 欧美成人午夜电影| 午夜私人影院久久久久| 不卡的av在线播放| 精品福利二区三区| 亚洲成人先锋电影| 99re在线精品| 国产精品乱人伦中文| 国内精品久久久久影院薰衣草| 欧美亚洲国产一区二区三区| 国产精品每日更新| 国产毛片精品视频| 精品国产乱码久久| 奇米亚洲午夜久久精品| 3751色影院一区二区三区| 一区二区高清免费观看影视大全| 国产宾馆实践打屁股91| 亚洲第一狼人社区| 麻豆高清免费国产一区| 欧美久久一二三四区| 一区二区在线电影| 91色乱码一区二区三区| 亚洲欧洲精品一区二区三区不卡 | 在线观看区一区二| 亚洲精品国产第一综合99久久 | 欧美在线|欧美| 自拍偷拍国产亚洲| 91美女片黄在线观看91美女| 中文字幕一区二区日韩精品绯色| yourporn久久国产精品| 中文字幕一区二区三区不卡在线 | 久久国产尿小便嘘嘘| 精品国产乱码久久久久久免费| 蜜臀av一区二区在线免费观看| 欧美久久久久免费| 蜜臀av性久久久久蜜臀aⅴ四虎| 日韩午夜在线播放| 国产精品一区久久久久| 中文字幕欧美国产| 9i在线看片成人免费| 一级日本不卡的影视| 欧美色网站导航| 三级不卡在线观看| 精品乱码亚洲一区二区不卡| 国产原创一区二区| 国产精品免费av| 在线观看免费成人| 免费av网站大全久久| 精品久久久久一区二区国产| 成人综合在线视频| 亚洲免费电影在线| 欧美一二三四在线| 国产精品1024| 亚洲午夜激情网站| 日韩精品专区在线影院观看| 国产老妇另类xxxxx| 综合久久国产九一剧情麻豆| 在线免费av一区| 国产一区二区三区精品欧美日韩一区二区三区 | 国产91精品一区二区麻豆亚洲| 亚洲美女淫视频| 日韩精品自拍偷拍| 91免费版在线看| 国内成+人亚洲+欧美+综合在线| 国产精品久久二区二区| 3atv在线一区二区三区| 懂色av噜噜一区二区三区av| 亚洲va韩国va欧美va| 国产亚洲成aⅴ人片在线观看| 欧美性生活大片视频| 国产乱码字幕精品高清av| 一区二区三区在线播放| 久久五月婷婷丁香社区| 欧美综合色免费| 国产真实乱子伦精品视频| 亚洲精品久久久蜜桃| 久久夜色精品一区| 精品1区2区3区| 99久久久精品| 国内成人自拍视频| 日本女人一区二区三区| 亚洲乱码国产乱码精品精小说| 精品欧美乱码久久久久久1区2区 | 精品日韩在线一区| 欧美日韩一区在线| 福利91精品一区二区三区| 日韩av网站在线观看| 亚洲精品水蜜桃| 国产精品视频一区二区三区不卡| 日韩免费性生活视频播放| 在线影视一区二区三区| 成人av电影免费在线播放| 麻豆一区二区99久久久久| 亚洲成人av电影在线| 综合久久综合久久| 国产精品电影一区二区| 国产日韩精品一区二区三区| 日韩欧美国产wwwww| 欧美老女人第四色| 欧美揉bbbbb揉bbbbb| 色婷婷av一区| 91免费精品国自产拍在线不卡| 国产成人免费xxxxxxxx| 极品销魂美女一区二区三区| 美女被吸乳得到大胸91| 舔着乳尖日韩一区| 亚洲va欧美va国产va天堂影院| 亚洲一区二区三区四区不卡| 一区二区在线观看免费| 一区二区在线电影| 一区二区三区中文字幕| 亚洲一区二区三区小说| 亚洲线精品一区二区三区八戒| 夜夜精品视频一区二区| 亚洲国产另类av| 午夜精品爽啪视频| 日韩电影一二三区| 九九国产精品视频| 国产成人高清在线| 91老师片黄在线观看| 在线精品观看国产| 91精品欧美久久久久久动漫| 欧美一区二区三区小说| 欧美成人在线直播| 中文字幕精品在线不卡| 亚洲图片另类小说| 午夜伊人狠狠久久| 麻豆91精品视频| 国产成人午夜99999| 色狠狠色狠狠综合| 欧美一区二区三区四区高清| 欧美sm美女调教| 国产精品女人毛片| 亚洲综合一区二区精品导航| 日本亚洲免费观看| 国产成人午夜精品影院观看视频 | 精品国产一区二区三区不卡| 久久久99久久| 一区二区三区欧美在线观看| 日韩激情一区二区| 国产成人免费网站| 欧美日韩一区二区三区视频| 欧美一区二区美女| 中文字幕一区视频| 日韩精品电影一区亚洲| 国产成人av一区二区三区在线 | 国产午夜精品理论片a级大结局 | 久久精品欧美日韩| 一区二区三区中文字幕精品精品 | 夜夜精品视频一区二区| 久久国产剧场电影| 色诱亚洲精品久久久久久| 欧美一级免费大片| 日韩毛片一二三区| 黑人巨大精品欧美黑白配亚洲| 欧美专区亚洲专区| 国产视频在线观看一区二区三区| 亚洲第一综合色| 99精品欧美一区二区三区小说| 欧美一区二区精美| 曰韩精品一区二区| 成人性视频免费网站| 日韩午夜精品电影| 一区二区三区四区激情| 国产福利一区在线| 日韩一级片网站| 亚洲网友自拍偷拍| 99久久综合国产精品| 久久久综合网站| 日本免费新一区视频| 99久久精品国产毛片| 国产亚洲成年网址在线观看| 麻豆成人免费电影| 91精品国产综合久久香蕉的特点 | 中文字幕欧美日韩一区| 久久精品国产一区二区三 | 蜜臀av一级做a爰片久久| 成人免费视频国产在线观看| 精品国产一区二区在线观看| 亚洲无线码一区二区三区| 91丨porny丨国产| 国产精品视频第一区| 成人自拍视频在线观看| 精品成人一区二区三区| 免费三级欧美电影| 欧美日韩一区二区三区高清 | 欧美吻胸吃奶大尺度电影| 日韩久久一区二区| aaa亚洲精品一二三区| 中文字幕在线观看不卡| 成人永久免费视频| 国产亚洲va综合人人澡精品 | 中文字幕av一区二区三区高 | 国产精品天美传媒沈樵| 国产精品一二一区|