Exemple #1
0
int fun(){
    int i;
    for(i=1;i<root;i++){
		if(freq[i] ==0 ){
			leaf.push(i);
		}
	}
	
	int f, p;
	i = 0;
	while(! leaf.empty() ){
		f = leaf.top(); leaf.pop();
		p = node[i];
		edge.insert( make_pair(p, f) );
		if(--freq[p] == 0 && p < root-1){
			leaf.push(p);
		}
		i++;
	}
	edge.erase(0);
	
	printf("(");
	traceback(root-1);
	printf(")\n");
	edge.clear();
}
Exemple #2
0
void readIn(){
    int n;
    e.clear();
    r.clear();
    h.clear();
    string a, b;

    cin>>n;
    while(n--){ // type of plug
        cin>>a;
        e.insert(a);
    }
    cin>>n;
    while(n--){ // type of device
        cin>>a>>b;
        if(e.find(b) != e.end()){
            e.erase(b);
        } else {
            r[b]++;
        }
    }
    cin>>n;
    while(n--){ // type of adapter
        cin>>a>>b;
        //h.insert(make_pair(a,b));
        h.insert(make_pair(b,a));
    }
}
Exemple #3
0
void patchSettingExit()
{
	SendDlgItemMessage(hIpsDlg, IDC_SCREENSHOT_H, STM_SETIMAGE, IMAGE_BITMAP, 0);

	memset(hItemHandles, 0, MAX_NODES);
	memset(hPatchHandlesIndex, 0, MAX_NODES);

	nPatchIndex = 0;
	nNumPatches = 0;

	for (int i = 0; i < MAX_NODES; i++) {
		szPatchFileNames[i][0] = _T('\0');
		szDataNames[i][0] = _T('\0');
	}

	// clear relations
	depTable.clear();
	confTable.clear();
	itemStateTable.clear();

	if (hPreview) {
		DeleteObject((HGDIOBJ)hPreview);
		hPreview = NULL;
	}

	if (hDefPreview) {
		DeleteObject((HGDIOBJ)hDefPreview);
		hDefPreview = NULL;
	}

	DeleteObject(hWhiteBGBrush);

	EndDialog(hIpsDlg, 0);
}
Exemple #4
0
void SV_SectorList_f( void )
{
	areaParms_t		ap;

//	ap.mins = mins;
//	ap.maxs = maxs;
//	ap.list = list;
//	ap.count = 0;
//	ap.maxcount = maxcount;

	entStats.clear();
	SV_AreaEntitiesTree(sv_worldSectors,&ap,0);
	char mess[1000];
	multimap<int,pair<int,list<CBBox> > >::iterator j;
	for(j=entStats.begin();j!=entStats.end();j++)
	{
		sprintf(mess,"**************************************************\n");
		Sleep(5);
		OutputDebugString(mess);
		sprintf(mess,"level=%i, count=%i\n",(*j).first,(*j).second.first);
		Sleep(5);
		OutputDebugString(mess);
		list<CBBox>::iterator k;
		for(k=(*j).second.second.begin();k!=(*j).second.second.end();k++)
		{
			sprintf(mess,"mins=%f %f %f, maxs=%f %f %f\n",
					(*k).mMins[0],(*k).mMins[1],(*k).mMins[2],(*k).mMaxs[0],(*k).mMaxs[1],(*k).mMaxs[2]);
			OutputDebugString(mess);
		}
	}

}
Exemple #5
0
 LRUCache(int capacity)
 {
     count = 0;
     count2Key.clear();
     key2Value2Count.clear();
     max = capacity;
 }
Exemple #6
0
 void init() {
     double INF = 262144;
     S.clear();
     S.insert(make_pair(Seg(Pt(-INF, -INF), Pt(INF, -INF), -1, -1), (Triangle*)NULL));
     S.insert(make_pair(Seg(Pt(-INF,  INF), Pt(INF,  INF), -1, -1), (Triangle*)NULL));
     status = 0;
 }
void DFHack::EventManager::onStateChange(color_ostream& out, state_change_event event) {
    static bool doOnce = false;
    if ( !doOnce ) {
        //TODO: put this somewhere else
        doOnce = true;
        EventHandler buildingHandler(Buildings::updateBuildings, 100);
        DFHack::EventManager::registerListener(EventType::BUILDING, buildingHandler, NULL);
        //out.print("Registered listeners.\n %d", __LINE__);
    }
    if ( event == DFHack::SC_WORLD_UNLOADED ) {
        lastTick = 0;
        lastJobId = -1;
        for ( auto i = prevJobs.begin(); i != prevJobs.end(); i++ ) {
            Job::deleteJobStruct((*i).second);
        }
        prevJobs.clear();
        tickQueue.clear();
        livingUnits.clear();
        nextItem = -1;
        nextBuilding = -1;
        buildings.clear();
        constructions.clear();

        Buildings::clearBuildings(out);
        gameLoaded = false;
        nextInvasion = -1;
    } else if ( event == DFHack::SC_WORLD_LOADED ) {
        uint32_t tick = DFHack::World::ReadCurrentYear()*ticksPerYear
            + DFHack::World::ReadCurrentTick();
        multimap<uint32_t,EventHandler> newTickQueue;
        for ( auto i = tickQueue.begin(); i != tickQueue.end(); i++ ) {
            newTickQueue.insert(pair<uint32_t,EventHandler>(tick + (*i).first, (*i).second));
        }
        tickQueue.clear();

        tickQueue.insert(newTickQueue.begin(), newTickQueue.end());

        nextItem = 0;
        nextBuilding = 0;
        lastTick = 0;
        nextInvasion = df::global::ui->invasions.next_id;
        gameLoaded = true;
    }
}
 void a_search(string t, multimap<string, int>& pos)
 {
     //扫描文本t
     //返回其中出现的字典树中的字符串及其位置 存储于映射表pos中
     pos.clear();
     int i(0);
     ac_node *p(&a_root);
     while(i < (int)t.length())
     {
         int index = t[i] - 'a';
         while(p->a_ch[index] == NULL && p != &a_root)
             //若字典树中该节点不存在
             //则沿着fail指针递归 直到回到根节点
             p = p->a_fail;
         if(p->a_ch[index] == NULL)
             p = &a_root;
         else
         {
             //若点p的孩子节点index存在
             //即该孩子节点与文本下标i处字符匹配
             p = p->a_ch[index];
             ac_node *tmp(p);
             while(tmp != &a_root)
             {
                 //通过指针tmp找出所有可能与文本下标i处匹配的字符串
                 //因为除了p的孩子节点index 还可能存在其他字符串此时也与i处匹配
                 //
                 //在文档"AC自动机算法详解" 作者"极限定律"中
                 //第一个有问题的地方是:
                 //原文中该处的判断条件是:
                 //while(tmp != root && tmp->a_cnt == 0)
                 //(原文与本文中的变量名不一样 但代码的含义没有曲解)
                 //但是经过测试这里tmp->a_cnt == 0的条件恰好应该是相反的
                 //即tmp->a_cnt != 0 也可写作tmp->a_cnt(该值为正时即true)
                 if(tmp->a_cnt)
                 {
                     string s(a_getstring(tmp));
                     pos.insert(make_pair(s, i - (int)s.length() + 1));
                     //文档"AC自动机算法详解" 作者"极限定律"中
                     //第二个有问题的地方则是:
                     //原文中该处有一处操作:
                     //tmp->a_cnt = 0;
                     //(原文与本文中的变量名不一样 但代码的含义没有曲解)
                     //但我不太明白为何要将字典树中该字符串删除
                     //也可能只求字符串第一次出现的位置
                     //本文的代码中没有删除字符串
                     //测试用例中可以看出本文的代码找出了所有匹配到的字符串位置
                 }
                 tmp = tmp->a_fail;
             }
         }
         ++ i;
     }
 }
Exemple #9
0
void clearMimeHandlerCache()
{
    LOGDEB(("clearMimeHandlerCache()\n"));
    typedef multimap<string, RecollFilter*>::value_type value_type;
    multimap<string, RecollFilter *>::iterator it;
    PTMutexLocker locker(o_handlers_mutex);
    for (it = o_handlers.begin(); it != o_handlers.end(); it++) {
	delete it->second;
    }
    o_handlers.clear();
}
Exemple #10
0
void jack_host::get_automation(int param_no, multimap<uint32_t, automation_range> &dests)
{
    dests.clear();
    if (!cc_mappings)
        return;
    for(automation_map::iterator i = cc_mappings->begin(); i != cc_mappings->end(); ++i)
    {
        if (param_no == -1 || param_no == i->second.param_no)
            dests.insert(*i);
    }
}
Exemple #11
0
 vector<string> findItinerary(vector<pair<string, string>> tickets) 
 {
     trav.clear();
     for (int i=0;i<tickets.size();++i)
         trav.emplace(tickets[i].first, tickets[i].second);
     
     ans.clear();
     solve("JFK");
     
     reverse(ans.begin(), ans.end());
     return ans;
 }
Exemple #12
0
static int parseRelations()
{
	depTable.clear();
	confTable.clear();

	char assistName[MAX_PATH];
	sprintf(assistName, "%s\\%s\\%s", WtoA(getMiscPath(PATH_IPS)), BurnDrvGetTextA(DRV_NAME), "assistant.txt");

	//parse ips dat and update the treewidget
	FILE* fp = fopen(assistName, "rt");
	if (!fp) {
		return 1;
	}

	char s[1024];
	char* p = NULL;
	string line;
	size_t nLen = 0;
	size_t pos = string::npos;

	while (!feof(fp)) {
		if (fgets(s, sizeof s, fp) != NULL) {
			p = s;
			// skip UTF-8 sig
			if (strncmp(p, UTF8_SIGNATURE, strlen(UTF8_SIGNATURE)) == 0) {
				p += strlen(UTF8_SIGNATURE);
			}

			if (p[0] == '#') {
				continue; // skip comment
			}

			getLine(p);
			line = p;

			pos = line.find(">");
			if (pos != string::npos) {
				StringList depStrs = split2Str(line, ">");
				string parent = *(depStrs.begin());
				lowerString(parent);
				StringList children = stringSplit(depStrs.back(), ",");
				lowerTrimmed(children);
				depTable.insert(make_pair(parent, children));
			} else {
				StringList conflicts = stringSplit(line, ",");
				lowerTrimmed(conflicts);
				confTable.push_back(conflicts);
			}
		}
	}

	return 0;
}
Exemple #13
0
    void operator& (multimap<double,double>& x, istream& stream) {
	size_t l;
	l & stream;
	validateListSize (l);
	x.clear ();
	multimap<double,double>::iterator pos = x.begin ();
	for (size_t i = 0; i < l; ++i) {
	    double s;
	    double t;
	    s & stream;
	    t & stream;
	    pos = x.insert (pos, make_pair (s,t));
	}
    }
void OP_perf_utils::op_release_resources(void)
{
	map<pid_t, operf_process_info *>::iterator it = process_map.begin();
	while (it != process_map.end())
		delete it++->second;
	process_map.clear();

	multimap<string, struct operf_mmap *>::iterator images_it = all_images_map.begin();
	while (images_it != all_images_map.end())
		delete images_it++->second;
	all_images_map.clear();
	delete kernel_mmap;

	operf_sfile_close_files();
	operf_free_modules_list();

}
	int countRangeSum(vector<int>& nums, int lower, int upper)
	{
		_hash.clear(); _prefix.clear();
		_prefix.push_back(0);
		for (int i = 0, sz = nums.size(); i < sz; i++)
		{
			_prefix.push_back(_prefix.back() + nums[i]);
			_hash.insert(make_pair(_prefix.back(), i + 1));
		}
		int ret = 0;
		for (int i = 0, sz = _prefix.size(); i < sz; i++)
		{
			int64_t hoge = _prefix[i];
			for (auto it = _hash.lower_bound(hoge + lower);
				it != _hash.end() && it -> first <= hoge + upper; it++ )
				if (it -> second > i)
					ret++;
		}
		return ret;
	}
Exemple #16
0
void solve() {
	int i, j, cnt = 0;
	for (i = 0; i < n; i++) {
		tr[i].get();
		ev[cnt++] = EVENT(i, tr[i].p1.x, IN);
		ev[cnt++] = EVENT(i, tr[i].p2.x, CH);
		ev[cnt++] = EVENT(i, tr[i].p3.x, OUT);
	}
	sort(ev, ev + cnt);
	T.clear();
	T.insert(make_pair(SEG(POINT(-INF, -INF), POINT(INF, -INF), -1), 1));
	T.insert(make_pair(SEG(POINT(-INF, INF), POINT(INF, INF), -1), 0));
	curx = 0, ans = 1;
	for (i = 0; i < cnt && ans != -1; i++) {
		j = ev[i].id, curx = ev[i].x;
		if (ev[i].type == IN) {
			tr[j].p12 = T.insert(make_pair(SEG(tr[j].p1, tr[j].p2, j), 0));
			tr[j].p13 = T.insert(make_pair(SEG(tr[j].p1, tr[j].p3, j), 0));
			if (!isok(tr[j].p12) || !isok(tr[j].p13)) ans = -1;
			else {
				IT t = tr[j].p12;
				if (++t == tr[j].p13) update(tr[j].p12, tr[j].p13);
				else update(tr[j].p13, tr[j].p12);
			}
		} else if (ev[i].type == CH) {
			if (!isok(tr[j].p12)) ans = -1;
			else {
				tr[j].p23 = T.insert(make_pair(SEG(tr[j].p2, tr[j].p3, j), tr[j].p12->second));
				T.erase(tr[j].p12);
				if (!isok(tr[j].p23)) ans = -1;
			}
		} else if (ev[i].type == OUT) {
			if (!isok(tr[j].p13) || !isok(tr[j].p23)) ans = -1;
			else T.erase(tr[j].p13), T.erase(tr[j].p23);
		}
	}
	if (ans == -1) printf("ERROR\n");
	else printf("%d shades\n", ans);
}
Exemple #17
0
		double getValue(double value){


            if(type == Filter_Median){
                data.push_back(value);

				medianMap.clear();
				for(int i=0; i < data.size(); i++){
                    medianMap.insert(make_pair(data[i], data[i]));
                }

				double median = getValue();

				medians.push_back(median);

				if(medians.size() > mediansLength){
					medians.erase(medians.begin());
				}

				value = 0.0;
				for(unsigned int i=0; i<medians.size(); i++){
					value += medians[i];
				}

				value = value / (double) medians.size();
			}
			else if(type == Filter_Average){
				data.push_back(value);
				value = getValue();
			}


			if(data.size() > bufferLength){
				data.erase(data.begin());
			}


			return value;
		}
Exemple #18
0
int main()
{
    int no_n_t,no_t;
    printf("No of Non Terminals\n");
    scanf("%d",&no_n_t);
    printf("Enter Non Terminals\n");
    string non_terminal,terminal;
    while(no_n_t--)
    {
        cin>>non_terminal;
        n_t.push_back(non_terminal);
    }
    printf("No of Terminals\n");
    scanf("%d",&no_t);
    printf("Enter Terminals\n");
    while(no_t--)
    {
        cin>>terminal;
        t.push_back(terminal);
    }
    printf("Enter Rules\n");
    char c;
    string rule,cur_rule;
    int len;
    multimap<string,string>::iterator it;
    fflush(stdin);
    for(unsigned int i=0;i<n_t.size();i++)
    {
        rule.clear();
        cout<<"For "<<n_t[i]<<":"<<endl;
        while((c=getc(stdin))!='\n')
        {
            rule.push_back(c);
        }
        //cout<<rule<<endl;
        /*********************/
        /* Rules Parser ('|')*/
        /*********************/
        len=rule.size();
        cur_rule.clear();
        for(int j=0;j<len;j++)
        {
            if(rule[j]=='|')
            {
                rules.insert(pair<string,string>(n_t[i],cur_rule));
                cur_rule.clear();
            }
            else
            {
                cur_rule.push_back(rule[j]);
            }
        }
        rules.insert(pair<string,string>(n_t[i],cur_rule));
        cur_rule.clear();
    }
    for(it=rules.begin();it!=rules.end();it++)
    {
        //cout<<(*it).first<<" "<<(*it).second<<endl;
    }
    //left_factor();

   /*********************************/
    /* Eliminating Left Recursion. */
    /*********************************/
    eliminate_left_recursion(rules);
    cout<<"New Rules"<<endl;
    update_non_terminals();
    for(it=rules.begin();it!=rules.end();it++)
    {
        cout<<(*it).first<<" "<<(*it).second<<endl;
    }
    cout<<"----------------------------------------------"<<endl;
    left_factor();
    update_non_terminals();
    rules.clear();
    for(it=left_factored_rules.begin();it!=left_factored_rules.end();it++)
    {
        rules.insert(pair<string,string>((*it).first,(*it).second));
    }
    cout<<"Rules after left factoring"<<endl;
    for(it=rules.begin();it!=rules.end();it++)
    {
        cout<<(*it).first<<" "<<(*it).second<<endl;
    }
    cout<<"Non Terminals..."<<endl;
    for(int i=0;i<n_t.size();i++)
    {
        cout<<n_t[i]<<endl;
    }

    first();
    follow();

    for(int i = 0; i < n_t.size(); i++)
    {
        vector<string> row(t.size()+1,"`");
        LL1_PT[n_t[i]] = row;
    }

    construct_LL1_pt();
    ofstream fout;
    fout.open("LL1_Table.ap");
    map< string,vector<string> > ::iterator ip;
//    fout<<"\t";
//    for(int i = 0; i < t.size(); i++)
//        fout<<t[i]<<"\t";
//    fout<<"#"<<endl;
    for(ip = LL1_PT.begin(); ip != LL1_PT.end(); ip++)
    {
        fout<<ip->first;
        for(int i = 0; i < t.size(); i++)
        {
            fout<<"\t"<<LL1_PT[ip->first][i];
        }
        fout<<"\t"<<LL1_PT[ip->first][t.size()]<<endl;
    }
    fout.close();

    fout.open("non_terminals.ap");
    for(int i = 0; i < n_t.size(); i++)
        fout<<n_t[i]<<"\t";
    fout.close();
    fout.open("terminals.ap");
    for(int i = 0; i < t.size(); i++)
        fout<<t[i]<<"\t";
    fout<<"#";
    fout.close();

    cout<<n_t[0]<<endl;
}
void DFHack::EventManager::onStateChange(color_ostream& out, state_change_event event) {
    static bool doOnce = false;
//    const string eventNames[] = {"world loaded", "world unloaded", "map loaded", "map unloaded", "viewscreen changed", "core initialized", "begin unload", "paused", "unpaused"};
//    out.print("%s,%d: onStateChange %d: \"%s\"\n", __FILE__, __LINE__, (int32_t)event, eventNames[event].c_str());
    if ( !doOnce ) {
        //TODO: put this somewhere else
        doOnce = true;
        EventHandler buildingHandler(Buildings::updateBuildings, 100);
        DFHack::EventManager::registerListener(EventType::BUILDING, buildingHandler, NULL);
        //out.print("Registered listeners.\n %d", __LINE__);
    }
    if ( event == DFHack::SC_MAP_UNLOADED ) {
        lastJobId = -1;
        for ( auto i = prevJobs.begin(); i != prevJobs.end(); i++ ) {
            Job::deleteJobStruct((*i).second, true);
        }
        prevJobs.clear();
        tickQueue.clear();
        livingUnits.clear();
        buildings.clear();
        constructions.clear();
        equipmentLog.clear();

        Buildings::clearBuildings(out);
        lastReport = -1;
        lastReportUnitAttack = -1;
        gameLoaded = false;

        multimap<Plugin*,EventHandler> copy(handlers[EventType::UNLOAD].begin(), handlers[EventType::UNLOAD].end());
        for (auto a = copy.begin(); a != copy.end(); a++ ) {
            (*a).second.eventHandler(out, NULL);
        }
    } else if ( event == DFHack::SC_MAP_LOADED ) {
        /*
        int32_t tick = df::global::world->frame_counter;
        multimap<int32_t,EventHandler> newTickQueue;
        for ( auto i = tickQueue.begin(); i != tickQueue.end(); i++ )
            newTickQueue.insert(pair<int32_t,EventHandler>(tick+(*i).first, (*i).second));
        tickQueue.clear();
        tickQueue.insert(newTickQueue.begin(), newTickQueue.end());
        //out.print("%s,%d: on load, frame_counter = %d\n", __FILE__, __LINE__, tick);
        */
        //tickQueue.clear();
        if (!df::global::item_next_id)
            return;
        if (!df::global::building_next_id)
            return;
        if (!df::global::job_next_id)
            return;
        if (!df::global::ui)
            return;
        if (!df::global::world)
            return;

        nextItem = *df::global::item_next_id;
        nextBuilding = *df::global::building_next_id;
        nextInvasion = df::global::ui->invasions.next_id;
        lastJobId = -1 + *df::global::job_next_id;

        constructions.clear();
        for ( auto i = df::global::world->constructions.begin(); i != df::global::world->constructions.end(); i++ ) {
            df::construction* constr = *i;
            if ( !constr ) {
                if ( Once::doOnce("EventManager.onLoad null constr") ) {
                    out.print("EventManager.onLoad: null construction.\n");
                }
                continue;
            }
            if ( constr->pos == df::coord() ) {
                if ( Once::doOnce("EventManager.onLoad null position of construction.\n") )
                    out.print("EventManager.onLoad null position of construction.\n");
                continue;
            }
            constructions[constr->pos] = *constr;
        }
        for ( size_t a = 0; a < df::global::world->buildings.all.size(); a++ ) {
            df::building* b = df::global::world->buildings.all[a];
            Buildings::updateBuildings(out, (void*)b);
            buildings.insert(b->id);
        }
        lastSyndromeTime = -1;
        for ( size_t a = 0; a < df::global::world->units.all.size(); a++ ) {
            df::unit* unit = df::global::world->units.all[a];
            for ( size_t b = 0; b < unit->syndromes.active.size(); b++ ) {
                df::unit_syndrome* syndrome = unit->syndromes.active[b];
                int32_t startTime = syndrome->year*ticksPerYear + syndrome->year_time;
                if ( startTime > lastSyndromeTime )
                    lastSyndromeTime = startTime;
            }
        }
        lastReport = -1;
        if ( df::global::world->status.reports.size() > 0 ) {
            lastReport = df::global::world->status.reports[df::global::world->status.reports.size()-1]->id;
        }
        lastReportUnitAttack = -1;
        lastReportInteraction = -1;
        reportToRelevantUnitsTime = -1;
        reportToRelevantUnits.clear();
        for ( size_t a = 0; a < EventType::EVENT_MAX; a++ ) {
            eventLastTick[a] = -1;//-1000000;
        }

        gameLoaded = true;
    }
}
int main()
{
	myPow[0] = 1;
	for(int i = 1; i < 110; ++i)
		myPow[i] = myPow[i - 1] * p;
	while(scanf("%d", &k) == 1)
	{
		mp.clear();
		if(k == 0) break;
		scanf("%s%s%s", w[0], w[1], s);
		wlen[0] = strlen(w[0]);
		wlen[1] = strlen(w[1]);
		slen = strlen(s);

		for(int i = 0; i < slen - wlen[0] + 1; ++i)
		{
			static char curKey[110];
			static bool vis[110];
			for(int j = 0; j < wlen[0]; ++j)
				curKey[j] = (((int)s[i + j] - 1 - w[0][j]) % 26 + 26) % 26 + 'A', vis[j + 1] = false;
			curKey[wlen[0]] = 0;
			initHash(curKey, wlen[0]);
			for(int l = 1; l <= k; ++l)
			{
				if(vis[l]) continue;
				int startPos = i % l;
				long long h = hashVal[l - 1];
				bool flag = true;
				for(int i = 0; i * l + l - 1 < wlen[0]; ++i)
				{
					if(h * (myPow[i * l]) != (hashVal[i * l + l - 1] - (i * l == 0 ? 0 : hashVal[i * l - 1])))
					{
						flag = false;
						break;
					}
				}
				if(!flag) continue;
				for(int i = wlen[0] / l * l, j = 0; i < wlen[0]; ++i, ++j)
				{
					if(curKey[i] != curKey[j])
					{
						flag = false;
						break;
					}
				}
				if(flag)
				{
					for(int i = 0; i * l <= wlen[0]; ++i)
						vis[i * l] = true;
					static char finalKey[110];
					h = 0;
					for(int i = startPos, j = 0; j < l; ++j, i = (i + 1) % l)
						finalKey[i] = curKey[j % wlen[0]];
					finalKey[l] = 0;
					for(int i = 0; i < l; ++i)
						h += myPow[i] * finalKey[i];
					mp.insert(make_pair(h, i));
				}
			}
		}
		int cnt = 0, keyLen;
		char key[110];
		long long resKey;
	//	printf("%d %d\n", wlen[0], wlen[1]);
		
		for(int i = 0; i < slen - wlen[1] + 1; ++i)
		{
			static char curKey2[110];
			static bool vis2[110];
			for(int j = 0; j < wlen[1]; ++j)
				curKey2[j] = (((int)s[i + j] - 1 - w[1][j]) % 26 + 26) % 26 + 'A', vis2[j + 1] = false;
			curKey2[wlen[1]] = 0;
			initHash(curKey2, wlen[1]);
			for(int l = 1; l <= k; ++l)
			{
				if(vis2[l]) continue;
				int startPos = i % l;
				long long h = hashVal[l - 1];
				bool flag = true;
				for(int i = 0; (i + 1) * l - 1 < wlen[1]; ++i)
				{
					if(h * (myPow[i * l]) != (hashVal[i * l + l - 1] - (i * l == 0 ? 0 : hashVal[i * l - 1])))
					{
						flag = false;
						break;
					}
				}
				if(!flag) continue;
				for(int i = wlen[1] / l * l, j = 0; i < wlen[1]; ++i, ++j)
				{
					if(curKey2[i] != curKey2[j])
					{
						flag = false;
						break;
					}
				}
				if(flag)
				{
					for(int i = 0; i * l <= wlen[1]; ++i)
						vis2[i * l] = true;
					static char finalKey2[110];
					h = 0;
					for(int i = startPos, j = 0; j < l; ++j, i = (i + 1) % l)
						finalKey2[i] = curKey2[j % wlen[1]];
					for(int i = 0; i < l; ++i)
						h += myPow[i] * finalKey2[i];
					finalKey2[l] = 0;
					pair<multimap<long long, int>::iterator, multimap<long long, int>::iterator> range;
					range = mp.equal_range(h);
					if(range.first == range.second) continue;
					range.second--;
			//		printf("%d %d\n", range.first -> second, range.second -> second);
					if(range.first -> second + wlen[0] - 1 < i || (range.second) -> second > i + wlen[1] - 1)
					{
						if(cnt != 0)
						{
							if(resKey == h) continue;
						}
						cnt++;
						if(cnt == 1)
						{
							for(int j = 0; j < l; ++j)
								key[j] = finalKey2[j];
							keyLen = l;
							resKey = h;
						}
					}
				}
			}
		}
		if(cnt == 1)
		{
			for(int i = 0, j = 0; i < slen; ++i, j = (j + 1) % keyLen)
			{
				putchar((((int)s[i] - 'A' - key[j] + 'A' - 1) % 26 + 26) % 26 + 'A');
			}
			puts("");
		}
		else
		{
			if(cnt > 1)
				puts("ambiguous");
			else
				puts("impossible");
		}
	}
	return 0;
}
Exemple #21
0
void left_factor()
{
    /*************************************/
    /* Algorithm
    /* Generate all the prefixes of
       all the rules.
    /* Take each prefix one by one
    /* Check if it is the common
    /* prefix of atleast two of the
    /* rules.
    /* Update the longest common prefix.*/
    /*************************************/
    bool non_terminal_used;
    string RHS;
    string pre;
    multimap<string,string>::iterator it;
    string new_left_rule;

//    for(int i=0;i<prefixes.size();i++)
//    {
//        cout<<"Prefix:"<<prefixes[i]<<endl;
//    }
    string prefix_of_rhs;
    int len_of_prefix;
    int len_of_longest_prefix;
    string longest_prefix; // keeps track of what is the longest prefix.
    int longest_prefix_index=-1;
    int count_of_matches; // keeps track of how many rules match for a given prefix.
    string left,remaining; // left holds the prefix. // remaining holds the remaining RHS.
    string new_non_terminal;
    for(int n=0;n<n_t.size();n++)
    {
        memset(is_considered,0,sizeof(is_considered));
        memset(is_matched,0,sizeof(is_matched));
        prefixes.clear();
        current_non_term_rules.clear();
        it=rules.find(n_t[n]);
        for(;it!=rules.end() && ((*it).first.compare(n_t[n])==0);it++)
        {
            current_non_term_rules.insert(pair<string,string>((*it).first,(*it).second));
        }
        for(it=current_non_term_rules.begin();it!=current_non_term_rules.end();it++)
        {
            pre.clear();
            RHS=(*it).second;
            //cout<<(*it).first<<"-->"<<(*it).second<<endl;
            //cout<<RHS.size();
            for(int i=0;i<RHS.size();i++)
            {
                pre.clear();
                for(int j=0;j<=i;j++)
                {
                    pre.push_back(RHS[j]);
                }
                if(find(prefixes.begin(),prefixes.end(),pre)==prefixes.end())
                    prefixes.push_back(pre);
            }
        }
//        for(it=current_non_term_rules.begin();it!=current_non_term_rules.end();it++)
//        {
//            cout<<(*it).first<<"-->"<<(*it).second;
//        }
        for(int m=0;m<current_non_term_rules.size();m++)
        {
            //cout<<"Round "<<m<<endl;
            longest_prefix.clear();
            for(int i=0;i<prefixes.size();i++)
            {
                //cout<<"Current Prefix:"<<prefixes[i]<<endl;
                len_of_prefix=prefixes[i].size();
                count_of_matches=0;
                for(it=current_non_term_rules.begin();it!=current_non_term_rules.end();it++)
                {
        //            if(is_matched[it-rules.begin()])
        //                continue;
                    prefix_of_rhs.clear();
                    RHS.clear();
                    RHS=(*it).second;
                    //cout<<(*it).first<<"-->"<<(*it).second<<endl;
                    if(RHS.size()<len_of_prefix|| is_considered[distance(current_non_term_rules.begin(),it)])
                        continue;
                    for(int j=0;j<len_of_prefix;j++)
                    {
                        prefix_of_rhs.push_back(RHS[j]);
                    }
                    //cout<<"Prefix of RHS:"<<prefix_of_rhs<<endl;
                    if(prefix_of_rhs.compare(prefixes[i])==0)
                    {
                        //cout<<prefix_of_rhs<<"matched with "<<prefixes[i]<<endl;
                        //cout<<"Rule No:"<<distance(rules.begin(),it)<<endl;
                        is_matched[i][distance(current_non_term_rules.begin(),it)]=true;
                        count_of_matches++;
                    }
                }
    //            cout<<"RUles after longest prefix"<<endl;
    //            for(it=rules.begin();it!=rules.end();it++)
    //            {
    //                cout<<"Rule No:"<<<<"-"<<(*it).first<<"-->"<<(*it).second<<endl;
    //            }
                //cout<<"Prefix is:"<<prefixes[i]<<" has count:"<<count_of_matches<<endl;
                if(count_of_matches>1 && prefixes[i].size()>=1)
                {
                    if(longest_prefix.size()<prefixes[i].size())
                    {
                        longest_prefix.clear();
                        longest_prefix=prefixes[i];
                        longest_prefix_index=i;
                    }
                }
            }
            //cout<<"Index:"<<longest_prefix_index<<"and longest prefix is :"<<longest_prefix<<"!"<<endl;
            if(longest_prefix_index!=-1 && longest_prefix.size()>=1)
            {
                /* Get rules which matched the longest prefix.*/
                non_terminal_used=false;
                new_non_terminal=next_nt_string();
                for(int j=0;j<current_non_term_rules.size();j++)
                {
                    if(is_matched[longest_prefix_index][j] && !is_considered[j])
                    {
                        non_terminal_used=true;
                        it=current_non_term_rules.begin();
                        advance(it,j);
                        RHS=(*it).second;
                        //cout<<"Rule No:"<<j<<"-"<<(*it).first<<"-->"<<(*it).second<<endl;
                        len_of_longest_prefix=longest_prefix.size();
                        left.clear();
                        remaining.clear();
                        for(int k=0;k<len_of_longest_prefix;k++)
                        {
                            left.push_back(RHS[k]);
                        }
                        if(RHS[len_of_longest_prefix]==' ')
                            len_of_longest_prefix++;
                        for(int k=len_of_longest_prefix;k<RHS.size();k++)
                        {
                            remaining.push_back(RHS[k]);
                        }
                        if(remaining.size()==0)
                            remaining="$"; //epsilon.
                        //cout<<"Remaining:"<<remaining<<" and new non terminal: "<<new_non_terminal<<endl;
                        /* Erase the current rule an push back the new rule in rules.*/
                        assert(left.compare(longest_prefix)==0);
                        //cout<<"Prefix:"<<left<<"and remaining: "<<remaining<<endl;
                        new_left_rule.clear();
                        if(longest_prefix[longest_prefix.size()-1]!=' ')
                            new_left_rule.append(longest_prefix).append(" ").append(new_non_terminal);
                        else
                            new_left_rule.append(longest_prefix).append(new_non_terminal);
                        left_factored_rules.insert(pair<string,string>(new_non_terminal,remaining));
                        is_considered[distance(current_non_term_rules.begin(),it)]=true;
                        //rules.erase(it);
                    }
                }
                if(non_terminal_used)
                {
                    left_factored_rules.insert(pair<string,string>((*it).first,new_left_rule));
                    left_fact_n_t.push_back(new_non_terminal);
                }
            }
        }
        update_rules(is_considered);
    }
    multimap<string,string>::iterator iter;
    for(iter=left_factored_rules.begin();iter!=left_factored_rules.end();iter++)
    {
        cout<<(*iter).first<<"-->"<<(*iter).second<<endl;
    }
}
int main() {
    
    int n;
    
    while(cin >> n >> ws) {
        
        // reset.
        vexp.clear();
        vvar.clear();
        
        vals.clear();
        expr.clear();
        
        vreq.assign(n, set<string>());
        vidx.clear();
        
        q.clear();
        
        broken = false;
        ans = 0;
        result.clear();
        

        // input and calculation.
        for(int i = 0; i < n; ++i) {
            
            //cout << "i = " << i << endl;
            
            string s;
            getline(cin, s);
            int p = s.find(' ');
            
            vvar.push_back(s.substr(0, p));
            vexp.push_back(s.substr(p + 3));
            
            //cout << "vvar = |" << vvar[i] << "|" << endl;
            //cout << "vexp = |" << vexp[i] << "|" << endl;
            
            
            // scratch all the reference variables.
            // add sentienl to split.
            istringstream iss(vexp.back());
            string v;
            
            while(iss >> v) {
                
                // if variable gotcha.
                if(isalpha(v[0])) {
                    
                    // initialize variable list
                    vals[v] = 0;
                    expr[v] = "";
                    
                    // add requirement link
                    vreq[i].insert(v);
                    
                    // add index link, AVOID repeatly link.
                    if(vidx[v].size() == 0 || vidx[v].back() != i) { 
                        vidx[v].push_back(i);
                    }
                }
                
            }

            // if the value is clear.
            if(vreq[i].size() == 0) {
                
                i64 val = eval(vexp.back());
                
                q.insert(make_pair(val, i));
                
            }
            
        }
        
        // proccess
        while(!q.empty()) {
            
            // pop from priority queue.
            i64 val = q.begin()->first;
            int i = q.begin()->second;
            q.erase(q.begin());
            
            // get var.
            string v = vvar[i];
            
            if(vals[v] == 0) {
            
                result.push_back(i);
                
                vals[v] = val;
                expr[v] = vexp[i];
                
                for(int j = 0; j < vidx[v].size(); ++j) {
                    
                    int k = vidx[v][j];
                    
                    // kick the link.
                    vreq[k].erase(v);
                    
                    // if all requirement was calculated.
                    if(vreq[k].empty()) {
                
                        i64 val = eval(vexp[k]);
                        
                        if(val != 0) q.insert(make_pair(val, k));
                        
                    }
                }
                
            }
            
        }
        
        
        // reduce..
        if(result.size() < vals.size()) broken = true;
        
        for(map<string, i64>::iterator it = vals.begin(); it != vals.end(); ++it) {
            
            // if overflow
            if(ans + it->second < ans) {
                broken = true;
                break;
            }
            
            ans += it->second;
            
        }
        
        if(broken) {
            cout << "stupid expressions!" << endl;
        }
        else {
            cout << ans << endl;
            for(int i = 0; i < result.size(); ++i) {
                int j = result[i];
                cout << vvar[j] << " = " << vexp[j] << endl;
            }
        }
        
    }
    
    return 0;
    
}
void RegularExpression::turingMachine(string regularExpression){

    firstDelimiter = find(reservedfirstDelimiters.begin(), reservedfirstDelimiters.end(), regularExpression[0]);   // verify if the first character is a delimiter

    if(regularExpression.size() == 1 || ((regularExpression[0] != regularExpression[regularExpression.size() - 1]) &&
        !(*firstDelimiter)) || (regularExpression[0] == '\\' || regularExpression[regularExpression.size() - 1] == '\\') ||
        regularExpression[0] == ']' || regularExpression[0] == '}' || regularExpression[0] == ')' ||
        regularExpression[0] == '>') cout << "Error: Missing primary delimiters" << endl;     // analyse if the first and last characters are not delimiters
    else if(regularExpression[0] == '[' && regularExpression[regularExpression.size() - 1] != ']' ||
            regularExpression[0] == '{' && regularExpression[regularExpression.size() - 1] != '}' ||
            regularExpression[0] == '(' && regularExpression[regularExpression.size() - 1] != ')' ||
            regularExpression[0] == '<' && regularExpression[regularExpression.size() - 1] != '>' ||
            regularExpression[0] == '/' && regularExpression[regularExpression.size() - 1] != '/' ||
            regularExpression[0] == '#' && regularExpression[regularExpression.size() - 1] != '#' ||
            regularExpression[0] == '~' && regularExpression[regularExpression.size() - 1] != '~' ||
            regularExpression[0] == '%' && regularExpression[regularExpression.size() - 1] != '%' ||
            regularExpression[0] == '@' && regularExpression[regularExpression.size() - 1] != '@' ||
            regularExpression[0] == '!' && regularExpression[regularExpression.size() - 1] != '!'){     // analyse if the first is a delimiter and close with its proprer closing delimiter
        if(regularExpression[regularExpression.size() - 1] == 'i' &&
            regularExpression[0] == '[' && regularExpression[regularExpression.size() - 2] != ']' ||
            regularExpression[0] == '{' && regularExpression[regularExpression.size() - 2] != '}' ||
            regularExpression[0] == '(' && regularExpression[regularExpression.size() - 2] != ')' ||
            regularExpression[0] == '<' && regularExpression[regularExpression.size() - 2] != '>' ||
            regularExpression[0] == '/' && regularExpression[regularExpression.size() - 2] != '/' ||
            regularExpression[0] == '#' && regularExpression[regularExpression.size() - 2] != '#' ||
            regularExpression[0] == '~' && regularExpression[regularExpression.size() - 2] != '~' ||
            regularExpression[0] == '%' && regularExpression[regularExpression.size() - 2] != '%' ||
            regularExpression[0] == '@' && regularExpression[regularExpression.size() - 2] != '@' ||
            regularExpression[0] == '!' && regularExpression[regularExpression.size() - 2] != '!'){     // for case insensitive
           cout << "Error: Expected closing delimiter for " << *firstDelimiter << " at position " << 0 << endl;
        }
        else if(regularExpression[regularExpression.size() - 1] != 'i'){
            cout << "Error: Expected closing delimiter for " << *firstDelimiter << " at position " << 0 << endl;
        }
    }
    else{
        if(countOccurrences(regularExpression, regularExpression[0], 0, regularExpression.size()) > 2){    // if primary delimeters have more than two ocurrences, because it's a nesting
            cout << "Error: Primary delimiters has a nesting" << endl;
        }
        else{
            for(runner = 0; runner < regularExpression.size(); runner++){
                firstDelimiter = find(reservedfirstDelimiters.begin(), reservedfirstDelimiters.end(), regularExpression[runner]);
                if(*firstDelimiter && regularExpression[runner - 1] != '\\'){    //  analyse if the first character is not escaping
                   if(*firstDelimiter == '['){
                        firstDelimiterPosition = findIt(regularExpression, '[', keepLastPositionOfSquareBrackets);
                        keepLastPositionOfSquareBrackets = firstDelimiterPosition;
                        runnerInside = firstDelimiterPosition;
                        found = false;
                        while(true){
                            secondDelimiter = find(reservedfirstDelimiters.begin(), reservedfirstDelimiters.end(), regularExpression[runnerInside]);
                            content += regularExpression[runnerInside];
                            runnerInside++;
                            if(regularExpression[runnerInside - 1] != '\\' && regularExpression[runnerInside] == '['){      // to avoid delimiter nesting
                                cout << "Error: Nested " << *firstDelimiter << " opening at position " << firstDelimiterPosition << endl;
                                found = false;
                                content = "";
                                break;
                            }
                            if(regularExpression[runnerInside - 1] != '\\' && regularExpression[runnerInside] == ']'){      // if the character is not escaping
                                found = true;
                                squareBracketsFlag = true;
                                content += regularExpression[runnerInside];
                                break;
                            }
                            if(runner != 0 && runnerInside == regularExpression.size() - 1){
                                found = false;
                                content = "";
                                break;
                            }
                        }
                        if(found == true){
                            secondDelimiterPosition = findIt(regularExpression, ']', keepLastPositionOfSquareBrackets + 1);
                            cout << "Delimiter " << *firstDelimiter << " opening at position " << firstDelimiterPosition << " and closing at position " << secondDelimiterPosition << endl;
                            keepLastPositionOfSquareBrackets = secondDelimiterPosition;

                            firstPair.insert(pair<int, string>(caller, content));
                            caller++;
                            secondPair.insert(pair<int, int>(firstDelimiterPosition, secondDelimiterPosition));
                            allExpressions.push_back(pair< multimap<int, string>, multimap<int, int> >(firstPair, secondPair));
                            content = "";
                            firstPair.clear();
                            secondPair.clear();
                        }
                        else if(regularExpression[firstDelimiterPosition - 1] != '\\'){
                            cout << "Error: Expected closing delimiter for " << *firstDelimiter << " at position " << firstDelimiterPosition << endl;
                            break;
                        }
                    }
                    else if(*firstDelimiter == '{'){
                        firstDelimiterPosition = findIt(regularExpression, '{', keepLastPositionOfCurlyBrackets);
                        keepLastPositionOfCurlyBrackets = firstDelimiterPosition;
                        runnerInside = firstDelimiterPosition;
                        found = false;
                        while(true){
                            secondDelimiter = find(reservedfirstDelimiters.begin(), reservedfirstDelimiters.end(), regularExpression[runnerInside]);
                            content += regularExpression[runnerInside];
                            runnerInside++;
                            if(regularExpression[runnerInside - 1] != '\\' && regularExpression[runnerInside] == '{'){
                                cout << "Error: Nested " << *firstDelimiter << " opening at position " << firstDelimiterPosition << endl;
                                found = false;
                                content = "";
                                break;
                            }
                            if(regularExpression[runnerInside - 1] != '\\' && regularExpression[runnerInside] == '}'){
                                found = true;
                                curlyBracketsFlag = true;
                                content += regularExpression[runnerInside];
                                break;
                            }
                            if(runner != 0 && runnerInside == regularExpression.size() - 1){
                                found = false;
                                content = "";
                                break;
                            }
                        }
                        if(found == true){
                            secondDelimiterPosition = findIt(regularExpression, '}', keepLastPositionOfCurlyBrackets + 1);
                            cout << "Delimiter " << *firstDelimiter << " opening at position " << firstDelimiterPosition << " and closing at position " << secondDelimiterPosition << endl;
                            keepLastPositionOfCurlyBrackets = secondDelimiterPosition;

                            firstPair.insert(pair<int, string>(caller, content));
                            caller++;
                            secondPair.insert(pair<int, int>(firstDelimiterPosition, secondDelimiterPosition));
                            allExpressions.push_back(pair< multimap<int, string>, multimap<int, int> >(firstPair, secondPair));
                            content = "";
                            firstPair.clear();
                            secondPair.clear();
                        }
                        else if(regularExpression[firstDelimiterPosition - 1] != '\\'){
                            cout << "Error: Expected closing delimiter for " << *firstDelimiter << " at position " << firstDelimiterPosition << endl;
                            break;
                        }
                    }
                    else if(*firstDelimiter == '('){
                        firstDelimiterPosition = findIt(regularExpression, '(', keepLastPositionOfRoundBrackets);
                        keepLastPositionOfRoundBrackets = firstDelimiterPosition;
                        runnerInside = firstDelimiterPosition;
                        found = false;
                        while(true){
                            secondDelimiter = find(reservedfirstDelimiters.begin(), reservedfirstDelimiters.end(), regularExpression[runnerInside]);
                            content += regularExpression[runnerInside];
                            runnerInside++;
                            if(regularExpression[runnerInside - 1] != '\\' && regularExpression[runnerInside] == '('){
                                cout << "Error: Nested " << *firstDelimiter << " opening at position " << firstDelimiterPosition << endl;
                                found = false;
                                content = "";
                                break;
                            }
                            if(regularExpression[runnerInside - 1] != '\\' && regularExpression[runnerInside] == ')'){
                                found = true;
                                roundBracketsFlag = true;
                                content += regularExpression[runnerInside];
                                break;
                            }
                            if(runner != 0 && runnerInside == regularExpression.size() - 1){
                                found = false;
                                content = "";
                                break;
                            }
                        }
                        if(found == true){
                            secondDelimiterPosition = findIt(regularExpression, ')', keepLastPositionOfRoundBrackets + 1);
                            cout << "Delimiter " << *firstDelimiter << " opening at position " << firstDelimiterPosition << " and closing at position " << secondDelimiterPosition << endl;
                            keepLastPositionOfRoundBrackets = secondDelimiterPosition;

                            firstPair.insert(pair<int, string>(caller, content));
                            caller++;
                            secondPair.insert(pair<int, int>(firstDelimiterPosition, secondDelimiterPosition));
                            allExpressions.push_back(pair< multimap<int, string>, multimap<int, int> >(firstPair, secondPair));
                            content = "";
                            firstPair.clear();
                            secondPair.clear();
                        }
                        else if(regularExpression[firstDelimiterPosition - 1] != '\\'){
                            cout << "Error: Expected closing delimiter for " << *firstDelimiter << " at position " << firstDelimiterPosition << endl;
                            break;
                        }
                    }
                    else if(*firstDelimiter == '<'){
                        firstDelimiterPosition = findIt(regularExpression, '<', keepLastPositionOfBrackets);
                        keepLastPositionOfBrackets = firstDelimiterPosition;
                        runnerInside = firstDelimiterPosition;
                        found = false;
                        while(true){
                            secondDelimiter = find(reservedfirstDelimiters.begin(), reservedfirstDelimiters.end(), regularExpression[runnerInside]);
                            content += regularExpression[runnerInside];
                            runnerInside++;
                            if(regularExpression[runnerInside - 1] != '\\' && regularExpression[runnerInside] == '<'){
                                cout << "Error: Nested " << *firstDelimiter << " opening at position " << firstDelimiterPosition << endl;
                                found = false;
                                content = "";
                                break;
                            }
                            if(regularExpression[runnerInside - 1] != '\\' && regularExpression[runnerInside] == '>'){
                                found = true;
                                bracketsFlag = true;
                                content += regularExpression[runnerInside];
                                break;
                            }
                            if(runner != 0 && runnerInside == regularExpression.size() - 1){
                                found = false;
                                content = "";
                                break;
                            }
                        }
                        if(found == true){
                            secondDelimiterPosition = findIt(regularExpression, '>', keepLastPositionOfBrackets + 1);
                            cout << "Delimiter " << *firstDelimiter << " opening at position " << firstDelimiterPosition << " and closing at position " << secondDelimiterPosition << endl;
                            keepLastPositionOfBrackets = secondDelimiterPosition;

                            firstPair.insert(pair<int, string>(caller, content));
                            caller++;
                            secondPair.insert(pair<int, int>(firstDelimiterPosition, secondDelimiterPosition));
                            allExpressions.push_back(pair< multimap<int, string>, multimap<int, int> >(firstPair, secondPair));
                            content = "";
                            firstPair.clear();
                            secondPair.clear();
                        }
                        else if(regularExpression[firstDelimiterPosition - 1] != '\\'){
                            cout << "Error: Expected closing delimiter for " << *firstDelimiter << " at position " << firstDelimiterPosition << endl;
                            break;
                        }
                    }
                    else if(*firstDelimiter == '/'){
                        bool nestingFlag = false;   // to avoid delimiter nesting of pairs of equal delimiters
                        if(slashFlag == false){     // to avoid to analyse twice when it reaches the closing delimiter
                            slashFlag = true;
                            firstDelimiterPosition = findIt(regularExpression, '/', keepLastPositionOfSlash);
                            keepLastPositionOfSlash = firstDelimiterPosition;
                            runnerInside = firstDelimiterPosition + 1;
                            found = false;
                            if(countOccurrences(regularExpression, '/', 0, regularExpression.size()) % 2 == 1) nestingFlag = true;
                            content += regularExpression[runnerInside - 1];
                            while(true){
                                secondDelimiter = find(reservedfirstDelimiters.begin(), reservedfirstDelimiters.end(), regularExpression[runnerInside]);
                                content += regularExpression[runnerInside];
                                runnerInside++;
                                if(nestingFlag == true){
                                    cout << "Error: Nested " << *firstDelimiter << " opening at position " << firstDelimiterPosition << endl;
                                    found = false;
                                    content = "";
                                    break;
                                }
                                if(regularExpression[runnerInside - 1] != '\\' && regularExpression[runnerInside] == '/'){
                                    found = true;
                                    content += regularExpression[runnerInside];
                                    break;
                                }
                                if(runner != 0 && runnerInside == regularExpression.size() - 1){
                                    found = false;
                                    content = "";
                                    break;
                                }
                            }
                            if(found == true){
                                secondDelimiterPosition = findIt(regularExpression, '/', keepLastPositionOfSlash + 1);
                                cout << "Delimiter " << *firstDelimiter << " opening at position " << firstDelimiterPosition << " and closing at position " << secondDelimiterPosition << endl;
                                keepLastPositionOfSlash = secondDelimiterPosition;

                                firstPair.insert(pair<int, string>(caller, content));
                                caller++;
                                secondPair.insert(pair<int, int>(firstDelimiterPosition, secondDelimiterPosition));
                                allExpressions.push_back(pair< multimap<int, string>, multimap<int, int> >(firstPair, secondPair));
                                content = "";
                                firstPair.clear();
                                secondPair.clear();
                            }
                            else if(regularExpression[firstDelimiterPosition - 1] != '\\'){
                                cout << "Error: Expected closing delimiter for " << *firstDelimiter << " at position " << firstDelimiterPosition << endl;
                                break;
                            }
                        }
                    }
                    else if(*firstDelimiter == '#'){
                        if(sharpFlag == false){
                            sharpFlag = true;
                            firstDelimiterPosition = findIt(regularExpression, '#', keepLastPositionOfSharp);
                            keepLastPositionOfSharp = firstDelimiterPosition;
                            runnerInside = firstDelimiterPosition + 1;
                            found = false;
                            content += regularExpression[runnerInside - 1];
                            while(true){
                                secondDelimiter = find(reservedfirstDelimiters.begin(), reservedfirstDelimiters.end(), regularExpression[runnerInside]);
                                content += regularExpression[runnerInside];
                                runnerInside++;
                                if(regularExpression[runnerInside - 1] != '\\' && regularExpression[runnerInside] == '#'){
                                    found = true;
                                    content += regularExpression[runnerInside];
                                    break;
                                }
                                if(runner != 0 && runnerInside == regularExpression.size() - 1){
                                    found = false;
                                    content = "";
                                    break;
                                }
                            }
                            if(found == true){
                                secondDelimiterPosition = findIt(regularExpression, '#', keepLastPositionOfSharp + 1);
                                cout << "Delimiter " << *firstDelimiter << " opening at position " << firstDelimiterPosition << " and closing at position " << secondDelimiterPosition << endl;
                                keepLastPositionOfSharp = secondDelimiterPosition;

                                firstPair.insert(pair<int, string>(caller, content));
                                caller++;
                                secondPair.insert(pair<int, int>(firstDelimiterPosition, secondDelimiterPosition));
                                allExpressions.push_back(pair< multimap<int, string>, multimap<int, int> >(firstPair, secondPair));
                                content = "";
                                firstPair.clear();
                                secondPair.clear();
                            }
                        }
                    }
                    else if(*firstDelimiter == '~'){
                        if(tildeFlag == false){
                            tildeFlag = true;
                            firstDelimiterPosition = findIt(regularExpression, '~', keepLastPositionOfTilde);
                            keepLastPositionOfTilde = firstDelimiterPosition;
                            runnerInside = firstDelimiterPosition + 1;
                            found = false;
                            content += regularExpression[runnerInside - 1];
                            while(true){
                                secondDelimiter = find(reservedfirstDelimiters.begin(), reservedfirstDelimiters.end(), regularExpression[runnerInside]);
                                content += regularExpression[runnerInside];
                                runnerInside++;
                                if(regularExpression[runnerInside - 1] != '\\' && regularExpression[runnerInside] == '~'){
                                    found = true;
                                    content += regularExpression[runnerInside];
                                    break;
                                }
                                if(runner != 0 && runnerInside == regularExpression.size() - 1){
                                    found = false;
                                    content = "";
                                    break;
                                }
                            }
                            if(found == true){
                                secondDelimiterPosition = findIt(regularExpression, '~', keepLastPositionOfTilde + 1);
                                cout << "Delimiter " << *firstDelimiter << " opening at position " << firstDelimiterPosition << " and closing at position " << secondDelimiterPosition << endl;
                                keepLastPositionOfTilde = secondDelimiterPosition;

                                firstPair.insert(pair<int, string>(caller, content));
                                caller++;
                                secondPair.insert(pair<int, int>(firstDelimiterPosition, secondDelimiterPosition));
                                allExpressions.push_back(pair< multimap<int, string>, multimap<int, int> >(firstPair, secondPair));
                                content = "";
                                firstPair.clear();
                                secondPair.clear();
                            }
                        }
                    }
                    else if(*firstDelimiter == '%'){
                        if(percentFlag == false){
                            percentFlag = true;
                            firstDelimiterPosition = findIt(regularExpression, '%', keepLastPositionOfPercent);
                            keepLastPositionOfPercent = firstDelimiterPosition;
                            runnerInside = firstDelimiterPosition + 1;
                            found = false;
                            content += regularExpression[runnerInside - 1];
                            while(true){
                                secondDelimiter = find(reservedfirstDelimiters.begin(), reservedfirstDelimiters.end(), regularExpression[runnerInside]);
                                content += regularExpression[runnerInside];
                                runnerInside++;
                                if(regularExpression[runnerInside - 1] != '\\' && regularExpression[runnerInside] == '%'){
                                    found = true;
                                    content += regularExpression[runnerInside];
                                    break;
                                }
                                if(runner != 0 && runnerInside == regularExpression.size() - 1){
                                    found = false;
                                    content = "";
                                    break;
                                }
                            }
                            if(found == true){
                                secondDelimiterPosition = findIt(regularExpression, '%', keepLastPositionOfPercent + 1);
                                cout << "Delimiter " << *firstDelimiter << " opening at position " << firstDelimiterPosition << " and closing at position " << secondDelimiterPosition << endl;
                                keepLastPositionOfPercent = secondDelimiterPosition;

                                firstPair.insert(pair<int, string>(caller, content));
                                caller++;
                                secondPair.insert(pair<int, int>(firstDelimiterPosition, secondDelimiterPosition));
                                allExpressions.push_back(pair< multimap<int, string>, multimap<int, int> >(firstPair, secondPair));
                                content = "";
                                firstPair.clear();
                                secondPair.clear();
                            }
                        }
                    }
                    else if(*firstDelimiter == '@'){
                        if(atFlag == false){
                            atFlag = true;
                            firstDelimiterPosition = findIt(regularExpression, '@', keepLastPositionOfAt);
                            keepLastPositionOfAt = firstDelimiterPosition;
                            runnerInside = firstDelimiterPosition + 1;
                            found = false;
                            content += regularExpression[runnerInside - 1];
                            while(true){
                                secondDelimiter = find(reservedfirstDelimiters.begin(), reservedfirstDelimiters.end(), regularExpression[runnerInside]);
                                content += regularExpression[runnerInside];
                                runnerInside++;
                                if(regularExpression[runnerInside - 1] != '\\' && regularExpression[runnerInside] == '@'){
                                    found = true;
                                    content += regularExpression[runnerInside];
                                    break;
                                }
                                if(runner != 0 && runnerInside == regularExpression.size() - 1){
                                    found = false;
                                    content = "";
                                    break;
                                }
                            }
                            if(found == true){
                                secondDelimiterPosition = findIt(regularExpression, '@', keepLastPositionOfAt + 1);
                                cout << "Delimiter " << *firstDelimiter << " opening at position " << firstDelimiterPosition << " and closing at position " << secondDelimiterPosition << endl;
                                keepLastPositionOfAt = secondDelimiterPosition;

                                firstPair.insert(pair<int, string>(caller, content));
                                caller++;
                                secondPair.insert(pair<int, int>(firstDelimiterPosition, secondDelimiterPosition));
                                allExpressions.push_back(pair< multimap<int, string>, multimap<int, int> >(firstPair, secondPair));
                                content = "";
                                firstPair.clear();
                                secondPair.clear();
                            }
                        }
                    }
                    else if(*firstDelimiter == '!'){
                        if(exclamationPointFlag == false){
                            exclamationPointFlag = true;
                            firstDelimiterPosition = findIt(regularExpression, '!', keepLastPositionOfExclamationPoint);
                            keepLastPositionOfExclamationPoint = firstDelimiterPosition;
                            runnerInside = firstDelimiterPosition + 1;
                            found = false;
                            content += regularExpression[runnerInside - 1];
                            while(true){
                                secondDelimiter = find(reservedfirstDelimiters.begin(), reservedfirstDelimiters.end(), regularExpression[runnerInside]);
                                content += regularExpression[runnerInside];
                                runnerInside++;
                                if(regularExpression[runnerInside - 1] != '\\' && regularExpression[runnerInside] == '!'){
                                    found = true;
                                    content += regularExpression[runnerInside];
                                    break;
                                }
                                if(runner != 0 && runnerInside == regularExpression.size() - 1){
                                    found = false;
                                    content = "";
                                    break;
                                }
                            }
                            if(found == true){
                                secondDelimiterPosition = findIt(regularExpression, '!', keepLastPositionOfExclamationPoint + 1);
                                cout << "Delimiter " << *firstDelimiter << " opening at position " << firstDelimiterPosition << " and closing at position " << secondDelimiterPosition << endl;
                                keepLastPositionOfExclamationPoint = secondDelimiterPosition;

                                firstPair.insert(pair<int, string>(caller, content));
                                caller++;
                                secondPair.insert(pair<int, int>(firstDelimiterPosition, secondDelimiterPosition));
                                allExpressions.push_back(pair< multimap<int, string>, multimap<int, int> >(firstPair, secondPair));
                                content = "";
                                firstPair.clear();
                                secondPair.clear();
                            }
                        }
                    }
                    else if(*firstDelimiter == ']' && squareBracketsFlag == false && regularExpression[runner - 1] != '\\'){
                        firstDelimiterPosition = findIt(regularExpression, ']', keepLastPositionOfSquareBrackets);
                        keepLastPositionOfSquareBrackets = firstDelimiterPosition;
                        cout << "Error: Expected opening delimiter for " << *firstDelimiter << " at position " << firstDelimiterPosition << endl;
                        break;
                    }
                    else if(*firstDelimiter == '}' && curlyBracketsFlag == false ){
                        firstDelimiterPosition = findIt(regularExpression, '}', keepLastPositionOfCurlyBrackets);
                        keepLastPositionOfCurlyBrackets = firstDelimiterPosition;
                        cout << "Error: Expected opening delimiter for " << *firstDelimiter << " at position " << firstDelimiterPosition << endl;
                        break;
                    }
                    else if(*firstDelimiter == ')' && roundBracketsFlag == false ){
                        firstDelimiterPosition = findIt(regularExpression, ')', keepLastPositionOfRoundBrackets);
                        keepLastPositionOfRoundBrackets = firstDelimiterPosition;
                        cout << "Error: Expected opening delimiter for " << *firstDelimiter << " at position " << firstDelimiterPosition << endl;
                        break;
                    }
                    else if(*firstDelimiter == '>' && bracketsFlag == false ){
                        firstDelimiterPosition = findIt(regularExpression, '>', keepLastPositionOfBrackets);
                        keepLastPositionOfBrackets = firstDelimiterPosition;
                        cout << "Error: Expected opening delimiter for " << *firstDelimiter << " at position " << firstDelimiterPosition << endl;
                        break;
                    }

                }
                //else{
                    // O LANCE DE VERIFICAÇÃO DE INTERCALAÇÃO DE DELIMITADORES(ERRO) SERÁ QUANDO FOR INSERIR NO VETOR
                    // PERMITIR ESCAPAGEM DE QUALQUER CARACTER, INCLUSIVE LETRA E NÚMERO, MAS SÓ TEM VALOR ESPECIAL SE FOR RESERVADO
                    // AQUI TRATAR O QUE NÃO ESTÁ DENTRO DOS DELIMITADORES

                    /*
                        Estou achando o parent da sequência do delimitador pra quando eu for analisar
                        dentro do delimitador saber onde foi chamado;
                    */
                //}
            }
        }
    }
}