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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? nfa-to-dfa.cpp

?? Full support for extended regular expressions (those with intersection and complement); Support for
?? CPP
?? 第 1 頁 / 共 2 頁
字號(hào):
	#endif
	}
	
	for(;;)
	{
		bool flag=false;
		
		for(int i=0; i<n; i++)
		{
			vector<int> &transitions=states[i].transitions;
			if(reachable_from_initial[i])
			{
				for(int j=0; j<number_of_symbols; j++)
					if(transitions[j]!=-1 && !reachable_from_initial[transitions[j]])
					{
					#ifdef DFA_THOROUGHLY_DEBUG_DEAD_STATES
						cout << i << " is reachable from initial ==> " << transitions[j] << " also is.\n";
					#endif
						reachable_from_initial[transitions[j]]=true;
						flag=true;
					}
			}
			if(!can_lead_to_final[i])
			{
				for(int j=0; j<number_of_symbols; j++)
					if(transitions[j]!=-1 && can_lead_to_final[transitions[j]])
					{
					#ifdef DFA_THOROUGHLY_DEBUG_DEAD_STATES
						cout << transitions[j] << " can lead to final ==> " << i << " also can.\n";
					#endif
						can_lead_to_final[i]=true;
						flag=true;
						break;
					}
			}
		}
		
		if(!flag) break;
	}
	
	for(int i=0; i<n; i++)
		state_is_live.push_back(reachable_from_initial[i] && can_lead_to_final[i]);
	
#ifdef DFA_DEBUG_DEAD_STATES
	for(int i=0; i<n; i++)
		if(!state_is_live[i])
		{
			cout << "state " << i << " is dead because it ";
			if(!reachable_from_initial[i])
				cout << "is unreachable from initial state";
			if(!reachable_from_initial[i] && !can_lead_to_final[i])
				cout << " and ";
			if(!can_lead_to_final[i])
				cout << "cannot lead to a final state";
			cout << ".\n";
		}
#endif
}

// partition.state_to_group[i]==j means that state i belongs to state group j.
// i \in partition.groups[j] means the same.
// if partition.state_to_group[i]==-1, then state i belongs to no state group
// and is ignored. In this case for all j not(i \in partition_groups[j]).
// partition.size() returns number of subsets in partition.
// minimize_dfa() takes an initial partition from partition.state_to_group
// (partition.groups is ignored) and completes the job of dividing the set of
// states into classes of equivalence.
// The function returns the number of those classes.
// If something is wrong with the source data, -1 is returned.
int minimize_dfa(DFA &dfa, DFA::Partition &partition)
{
#ifdef DEBUG_DFA_MINIMIZATION
	cout << "minimize_dfa(): arrived here.\n";
#endif
	if(!partition.state_to_group.size())
	{
		// if no initial partition is supplied, we shall divide the
		// states into accepting, nonaccepting and dead.
		dfa.determine_dead_states();
		for(int i=0; i<dfa.states.size(); i++)
			if(!dfa.state_is_live[i])
				partition.state_to_group.push_back(-1);
			else if(dfa.states[i].is_accepting)
				partition.state_to_group.push_back(1);
			else
				partition.state_to_group.push_back(0);
	}
	if(partition.state_to_group.size()!=dfa.states.size()) return -1;
	
#ifdef DEBUG_DFA_MINIMIZATION
	cout << "checkpoint 1\n";
#endif
	
	for(int i=0; i<dfa.states.size(); i++)
		if(partition.state_to_group[i]!=-1)
		{
			while(partition.state_to_group[i]>=partition.groups.size())
				partition.groups.push_back(set<int>());
			partition.groups[partition.state_to_group[i]].insert(i);
		}
	
#ifdef DEBUG_DFA_MINIMIZATION
	cout << "checkpoint 2\n";
#endif
	
	partition.group_to_original_group.clear();
	for(int i=0; i<partition.groups.size(); i++)
		partition.group_to_original_group.push_back(i);
	
#ifdef DEBUG_DFA_MINIMIZATION
	cout << "checkpoint 3\n";
#endif
	
	for(;;)
	{
		bool repeat_from_the_beginning=false;
		
		// note: vector partition.groups shall grow.
		for(int i=0; i<partition.groups.size(); i++)
		{
		#ifdef DEBUG_DFA_MINIMIZATION
			cout << i << ": " << partition.groups[i] << "\n";
		#endif
			if(partition.groups[i].size()<=1) continue;
			
			for(;;)
			{
				set<int> &group=partition.groups[i];
				bool repeat_flag=false;
				
				// trying to split this group
				for(int j=0; j<dfa.number_of_symbols; j++)
				{
					// all states in this group should have transitions
					// on j to states in target_group.
					int target_state=dfa.states[*group.begin()].transitions[j];
					int target_group_number=(target_state!=-1 ? partition.state_to_group[target_state] : -1);
					int new_target_group_number=-1;
					
					set<int>::iterator p;
					bool split_flag=false;
					for(p=group.begin(); p!=group.end(); p++)
					{
						int this_target_state=dfa.states[*p].transitions[j];
						new_target_group_number=(this_target_state!=-1 ? partition.state_to_group[this_target_state] : -1);
						if(new_target_group_number!=target_group_number)
						{
						#ifdef DEBUG_DFA_MINIMIZATION
							cout << "symbol " << j << ": target group is " << new_target_group_number << " (" << target_group_number << " expected).\n";
						#endif
							split_flag=true;
							break;
						}
					}
					
					if(!split_flag) continue;
					
					// splitting.
					set<int> new_group;
					int new_group_number=partition.groups.size();
					for(; p!=group.end(); p++)
					{
						int this_target_state=dfa.states[*p].transitions[j];
						int this_target_group=(this_target_state!=-1 ? partition.state_to_group[this_target_state] : -1);
						if(this_target_group==new_target_group_number)
							new_group.insert(*p);
					}
					for(set<int>::iterator p2=new_group.begin(); p2!=new_group.end(); p2++)
					{
						group.erase(*p2);
						partition.state_to_group[*p2]=new_group_number;
					}
					
					partition.groups.push_back(new_group);
					partition.group_to_original_group.push_back(partition.group_to_original_group[i]);
//					assert(partition.groups.size()==partition.group_to_original_group.size());
					
					repeat_flag=true;
				#ifdef DEBUG_DFA_MINIMIZATION
					cout << "setting repeat flag.\n";
				#endif
					break;
				}
				
				if(!repeat_flag) break;
			#ifdef DEBUG_DFA_MINIMIZATION
				cout << "repeat\n";
				cout << i << ": " << partition.groups[i] << "\n";
			#endif
				repeat_from_the_beginning=true;
			}
		}
		if(!repeat_from_the_beginning) break;
	#ifdef DEBUG_DFA_MINIMIZATION
		cout << "repeat from the beginning\n";
	#endif
	}
	
	partition.group_containing_initial_state=partition.state_to_group[0];
	
#ifdef DEBUG_DFA_MINIMIZATION
	cout << "minimize_dfa(): about to return.\n";
#endif
	return partition.groups.size();
}

void NFA::print(ostream &os)
{
	for(int i=0; i<states.size(); i++)
	{
		State &state=states[i];
	#if 0
		std::vector<std::pair<int, int> > transitions;

		std::vector<int> epsilon_transitions;

		bool is_accepting;
		bool is_important; // see Aho/Sethi/Ullman 1986, p. 134.
	#endif
		os << "State " << i;
		if(state.is_accepting)
			os << " (Accepting)";
		else if(state.is_important)
			os << " (Important)";
		os << ": ";
		
		bool written_smth=false;
		if(state.transitions.size())
		{
			os << "transitions " << state.transitions;
			written_smth=true;
		}
		if(state.epsilon_transitions.size())
		{
			if(written_smth) os << "; ";
			os << "epsilon transitions to " << state.epsilon_transitions;
			written_smth=true;
		}
		if(!written_smth)
			os << "No outgoing transitions";
		os << ".\n";
	}
}

void DFA::raw_print(ostream &os)
{
	for(int i=0; i<states.size(); i++)
	{
		State &state=states[i];
		
		os << i;
		if(state.is_accepting) os << "(Acc)";
		os << "\t";
		os << state.transitions << "\n";
	}
}
void DFA::print(ostream &os)
{
	for(int i=0; i<states.size(); i++)
	{
		State &state=states[i];
		
		os << "State " << i;
		if(state.is_accepting)
			os << " (Accepting)";
		
		if(state.nfa_states.size())
			os << " (NFA states " << state.nfa_states << ")";
		
		std::map<int, vector<int> > target_states;
		for(int j=0; j<state.transitions.size(); j++)
			if(state.transitions[j]>=0)
				target_states[state.transitions[j]].push_back(j);
		
		if(target_states.size()==0)
			os << ": No outgoing transitions.\n";
		else
		{
			os << ": ";
			
			for(std::map<int, vector<int> >::iterator p=target_states.begin(); p!=target_states.end(); p++)
			{
				if(p!=target_states.begin())
					os << ", ";
				
				if(p->second.size()==1)
					os << p->second[0];
				else
					os << p->second;
				
				os << " -> " << p->first;
			}
			os << "\n";
		}
	}
}	

char *character_to_string(int c)
{
	static char buffer[20];
	if(c=='\n')
		return "LF";
	else if(c=='\r')
		return "CR";
	else if(c=='\t')
		return "Tab";
	else if(c==' ')
		return "Space";
	else if(c=='"')
		return "\\\x22";
	else if(c=='\\')
		return "\\\\";
	else if(c>' ' && c<128)
	{
		sprintf(buffer, "%c", c);
		return buffer;
	}
	else
	{
		sprintf(buffer, "0x%02x", c);
		return buffer;
	}
}

void print_transitions_from_one_state_in_dot_format(int from, std::map<int, vector<int> > target_states, ostream &os)
{
	for(map<int, vector<int> >::iterator p=target_states.begin(); p!=target_states.end(); p++)
	{
		const vector<int> &v=p->second;
		
		os << "\tState" << from << " -> " << "State" << p->first << " [label=\x22";
		
		for(int pointer=0; pointer<v.size(); )
		{
			if(pointer>0) os << ",";
			int end_of_region=pointer;
			while(end_of_region+1<v.size() && v[end_of_region+1]-v[end_of_region]==1)
				end_of_region++;
			
			if(end_of_region==pointer)
				os << character_to_string(v[pointer]);
			else
			{
				os << character_to_string(v[pointer]);
				os << "..";
				os << character_to_string(v[end_of_region]);
			}
			
			pointer=end_of_region+1;
		}
		os << "\x22];\n";
	}
}

void DFA::print_in_dot_format(ostream &os)
{
	os << "\n";
	os << "/* A DFA created by Dolphin. */\n";
	os << "\ndigraph G\n";
	os << "{\n";
	os << "\tcenter=true;\n";
	os << "\trankdir=LR;\n";
	
	for(int i=0; i<states.size(); i++)
	{
		os << "\tState" << i << " [label=\x22" << i << "\x22";
		if(states[i].is_accepting)
			os << ", shape=doublecircle";
		else
			os << ", shape=circle";
		os << "];\n";
	}
	for(int i=0; i<states.size(); i++)
	{
		State &state=states[i];
		
		map<int, vector<int> > target_states;
		for(int j=0; j<state.transitions.size(); j++)
			if(state.transitions[j]>=0)
				target_states[state.transitions[j]].push_back(j);
		print_transitions_from_one_state_in_dot_format(i, target_states, os);
	}
	os << "}\n";
}	

void NFA::print_in_dot_format(ostream &os)
{
	os << "digraph G\n";
	os << "{\n";
	os << "\tcenter=true;\n";
	os << "\trankdir=LR;\n";
	
	for(int i=0; i<states.size(); i++)
	{
		os << "\tState" << i << " [label=\x22" << i << "\x22";
		if(states[i].is_accepting)
			os << ", shape=doublecircle";
		else
			os << ", shape=circle";
		if(states[i].is_important)
			os << ", style=filled";
		os << "];\n";
	}
	for(int i=0; i<states.size(); i++)
	{
		State &state=states[i];
		
		map<int, vector<int> > target_states;
		for(int j=0; j<state.transitions.size(); j++)
			target_states[state.transitions[j].second].push_back(state.transitions[j].first);
		print_transitions_from_one_state_in_dot_format(i, target_states, os);
		for(int j=0; j<state.epsilon_transitions.size(); j++)
			os << "\tState" << i << " -> State" << state.epsilon_transitions[j] << " [fontname=\x22Symbol\x22, label=\x22" "e" "\x22];\n";
	}
	os << "}\n";
}	

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人国产精品免费观看视频| 制服丝袜在线91| 欧美精品18+| 国产农村妇女精品| 免播放器亚洲一区| 在线观看一区日韩| 国产精品免费丝袜| 精品无码三级在线观看视频| 欧美午夜不卡在线观看免费| 欧美激情在线观看视频免费| 免费的成人av| 在线电影国产精品| 一级做a爱片久久| 成人动漫中文字幕| 久久精品视频一区二区三区| 日本不卡视频一二三区| 欧美日韩久久久一区| 亚洲黄色尤物视频| 99re热视频这里只精品| 欧美激情综合五月色丁香小说| 免费在线成人网| 51精品久久久久久久蜜臀| 洋洋av久久久久久久一区| 91视频免费播放| 国产精品九色蝌蚪自拍| 成人午夜激情在线| 国产人伦精品一区二区| 国产91丝袜在线播放| 精品久久五月天| 国产综合久久久久久鬼色| 日韩精品一区二区三区老鸭窝 | 2020国产精品自拍| 美女视频黄a大片欧美| 4438x亚洲最大成人网| 日本成人在线不卡视频| 欧美一级黄色大片| 九九视频精品免费| 精品999在线播放| 国产一区二区不卡老阿姨| 久久精品欧美日韩| 成人av动漫网站| 综合欧美一区二区三区| 日本乱码高清不卡字幕| 亚洲一区二区三区激情| 欧美老肥妇做.爰bbww| 日本在线不卡视频一二三区| 欧美大肚乱孕交hd孕妇| 国产精品一区一区三区| 国产精品久久久久久久蜜臀| 91免费视频观看| 亚洲大片在线观看| 精品国产污网站| 99久久久国产精品| 午夜影院久久久| 精品国产一区二区亚洲人成毛片| 国产大片一区二区| 亚洲综合一区二区精品导航| 91精品免费在线观看| 精品一区二区三区在线视频| 亚洲国产成人自拍| 欧美日韩精品一区二区三区蜜桃| 蜜桃av一区二区在线观看| 国产精品成人网| 欧美一区二区不卡视频| 国产成人鲁色资源国产91色综| 亚洲人成影院在线观看| 日韩精品专区在线| 一本一道久久a久久精品综合蜜臀| 日本视频在线一区| 国产精品久久久久久久久免费丝袜 | 亚洲精品视频一区二区| 欧美一级二级三级乱码| caoporn国产一区二区| 日韩av电影免费观看高清完整版 | 欧美四级电影网| 日韩一区二区在线观看视频播放 | 国产91在线看| 亚洲一区在线电影| 久久久国际精品| 欧美三级一区二区| 国产盗摄视频一区二区三区| 亚洲国产日日夜夜| 国产婷婷一区二区| 51精品视频一区二区三区| 成人永久看片免费视频天堂| 日韩电影一区二区三区| 亚洲男人天堂av| 国产日韩欧美高清在线| 欧美一二三区在线| 欧美日免费三级在线| av电影在线观看完整版一区二区| 久久99这里只有精品| 亚洲www啪成人一区二区麻豆| 中文字幕亚洲视频| 久久精品一区二区三区不卡牛牛| 日韩国产欧美视频| 玉米视频成人免费看| 欧美激情在线观看视频免费| 亚洲精品在线观看视频| 91精品国产综合久久精品性色| 日本道免费精品一区二区三区| 国产高清精品在线| 国产九色sp调教91| 激情图片小说一区| 精品一区二区精品| 蜜桃视频第一区免费观看| 丝袜美腿高跟呻吟高潮一区| 亚洲已满18点击进入久久| 亚洲黄色免费网站| 亚洲永久免费视频| 亚洲国产婷婷综合在线精品| 亚洲一级片在线观看| 亚洲一区成人在线| 天天操天天综合网| 麻豆精品在线观看| 狠狠色丁香婷婷综合久久片| 久久99国产精品尤物| 国产乱子伦视频一区二区三区| 激情深爱一区二区| 大桥未久av一区二区三区中文| 粉嫩av亚洲一区二区图片| 成人黄色在线网站| 色综合久久天天综合网| 欧洲激情一区二区| 欧美巨大另类极品videosbest| 欧美精品久久99| 久久综合九色综合欧美亚洲| 国产日韩在线不卡| 综合久久一区二区三区| 亚洲成人一区在线| 久久国产成人午夜av影院| 国产一区中文字幕| www.欧美色图| 欧美色综合久久| 欧美成人精品1314www| 日本一区二区在线不卡| 亚洲久草在线视频| 日日夜夜精品视频免费| 国产精品影视在线观看| 95精品视频在线| 欧美一级高清片在线观看| 国产亚洲欧美色| 亚洲午夜激情网站| 国产一区二区在线观看视频| 99精品黄色片免费大全| 91精品黄色片免费大全| 国产女同性恋一区二区| 亚洲综合激情小说| 精品一区二区在线视频| 色婷婷一区二区| 亚洲精品在线观看视频| 欧美一区二区福利在线| 成人欧美一区二区三区| 亚洲国产欧美日韩另类综合| 免费观看日韩av| 成人18精品视频| 欧美一区二区三区视频在线| 欧美国产日本韩| 日本视频在线一区| 91理论电影在线观看| 欧美成人一区二区三区| 樱桃视频在线观看一区| 国产精品正在播放| 欧美一区二区三区四区在线观看| 国产精品国产三级国产普通话99| 日欧美一区二区| 99久久精品国产一区二区三区| 欧美一区二区三区四区高清| 亚洲另类在线视频| 成人的网站免费观看| 精品日韩在线观看| 天天综合色天天综合| 91麻豆国产香蕉久久精品| 日本一区二区三区四区在线视频 | 国产精品免费看片| 精品中文av资源站在线观看| 国产拍欧美日韩视频二区| 五月天激情小说综合| 99r精品视频| 日本一区二区三区视频视频| 久久精品99久久久| 9191久久久久久久久久久| 成人免费一区二区三区在线观看| 国产尤物一区二区在线| 精品入口麻豆88视频| 三级亚洲高清视频| 欧洲国内综合视频| 亚洲女同一区二区| jiyouzz国产精品久久| 久久精品欧美一区二区三区不卡 | 国产午夜精品一区二区三区四区| 日韩有码一区二区三区| 欧美四级电影在线观看| 一区二区三区四区国产精品| 91香蕉视频黄| 亚洲综合清纯丝袜自拍| 欧美视频一区二区三区四区 | 91精品国产免费| 日本美女视频一区二区| 宅男在线国产精品|