⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2334.cpp

📁 这是哈尔滨工业大学acmOJ的源代码
💻 CPP
字号:
/*  This Code is Submitted by wywcgs for Problem 2334 on 2006-08-25 at 17:08:37 */ 
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
 
const int L = 64;
const int AN = 1024;
const int RN = 10240;
 
struct cmp {
	bool operator ()(const char* s1, const char* s2) const {
		return strcmp(s1, s2) < 0;
	}
};
 
map<char*, int, cmp> dict;
 
class Area {
public:
	char d[L], name[L];
	void make(int i) { scanf("%s %s", d, name); dict[name] = i; }
};
 
Area ar[AN];
int arn;
 
class Rule {
public:
	int y, ro, no;
	char d[L];
	void make();
	bool operator <(const Rule& r) const { return y < r.y; }
};
void Rule::make() {
	char w[L];
	scanf("%d %d %s %s", &y, &ro, w, d);
	no = dict.find(w)->second;
}
 
Rule r[RN];
int rn;
 
class Phone {
public:
	int b, e, ro, dl;
	char an[L], dn[12000], nm[L];
	bool make();
	bool parse(char*, int);
	bool red(Rule&);
	bool red(Area&, int);
	void update(const Rule&);
};
bool Phone::make() {
	scanf("%d %d %s", &b, &e, nm);
	if(b == 0 && e == 0 && !strcmp(nm, "0")) return false;
	else return true;
}
bool Phone::red(Rule& r) {
	if(r.ro != 3 || (r.y > b && r.y <= e)) return false;
	else if(parse(r.d, r.no)) return true;
	return false;
}
bool Phone::red(Area& a, int i) {
	if(parse(a.d, i)) return true;
	return false;
}
bool Phone::parse(char* w, int no) {
	if(strncmp(nm, w, strlen(w))) return false;
	ro = no;
	memset(dn, 0, sizeof(dn));
	strcpy(an, w);
	strcpy(dn, nm+strlen(w));
	dl = strlen(dn); return true;
}
void Phone::update(const Rule& r) {
	if(ro != r.no) return;
	int index;
	switch(r.ro) {
	case 1:
		dl++;
		sscanf(r.d, "%d", &index);
		for(int i = dl-1; i >= index; i--)
			dn[i] = dn[i-1];
	break;
	case 2:
		sscanf(r.d, "%d", &index);
		swap(dn[index-1], dn[index]);
	break;
	case 3: strcpy(an, r.d); break;
	}
}
 
int main()
{
	Phone p;
 
	while(scanf("%d", &arn) != EOF) {
		dict.clear();
		for(int i = 0; i < arn; i++) ar[i].make(i);
		scanf("%d", &rn);
		for(int i = 0; i < rn; i++) r[i].make();
		sort(r, r+rn);
		while(p.make()) {
			bool can = false;
			for(int i = rn-1; i >= 0 && !can; i--)
				if(p.red(r[i])) can = true;
			for(int i = 0; i < arn && !can; i++)
				if(p.red(ar[i], i)) can = true;
			for(int i = 0; i < rn; i++) {
				if(r[i].y <= p.b) continue;
				else if(r[i].y > p.e) break;
				else p.update(r[i]);
			}
			printf("%s%s\n", p.an, p.dn);
		}
	}
	
	return 0;
}

⌨️ 快捷键说明

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