📄 2334.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 + -