HDU 4409 大模拟 + LCA
2015-09-25 00:08
302 查看
[code]HDU 4409 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4409 题意: 大模拟看题很关键。 思路: 大模拟+LCA。 坑点 1)自己不能是自己的祖先。 2)对于Mr.X,他的兄弟数为1。 源码: //#pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <iomanip> #include <sstream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> #include <ctime> #include <climits> #include <cassert> #include <cmath> #include <string> #include <bitset> #include <vector> #include <deque> #include <list> #include <set> #include <map> #include <queue> #include <stack> #include <algorithm> #include <functional> #include <utility> #include <numeric> #define LL long long #define gmax(a,b) ((a) > (b) ? (a) : (b)) #define gmin(a,b) ((a) < (b) ? (a) : (b)) #define MOD (1000000007) using namespace std; map<string,int>mm; const int MAXN = 60000 + 5; struct D { int mark; int post; string name; vector<int>son; void init(string str, int _mark, int temp){name = str, mark = _mark, son.clear(); post = temp;} }d[MAXN]; int gen[MAXN]; int fa[MAXN]; bool cmp(int a, int b){return d[a].name < d[b].name;} int R[MAXN], deep[MAXN * 2], B[MAXN * 2], cnt; int num[MAXN]; int rmq[MAXN][30]; void dfs(int u, int p) { // printf("u = %d, p = %d\n", u, p); if(R[u] == -1) R[u] = cnt, deep[u] = deep[p] + 1; B[cnt++] = u; for(int i = 0 ; i < (int)d[u].son.size() ; i++){ int v = d[u].son[i]; dfs(v, u); B[cnt++] = u; } } int MIN(int a, int b) { if(deep[a] < deep[b]) return a; return b; } void RMQ_init() { memset(deep, 0, sizeof(deep)); memset(R, -1, sizeof(R)); cnt = 0; dfs(0, 0); for(int i = 0 ; i < cnt ; i++) rmq[i][0] = B[i]; for(int j = 1 ; (1 << j) <= cnt ; j++){ for(int i = 0 ; (i + (1 << j) - 1) < cnt ; i++){ rmq[i][j] = MIN(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]); // printf("rmq[%d][%d] = %d\n", i, j, rmq[i][j]); } } } void dfs2(int u) { for(int i = 0 ; i < d[u].post ; i++) printf("."); cout << d[u].name << endl; // printf("%s\n", d[u].name); for(int i = 0 ; i < (int)d[u].son.size() ; i++){ int v = d[u].son[i]; dfs2(v); } } void solve1() { dfs2(0); } void solve2() { string temp; cin >> temp; // cout << "temp = " << temp << " mm = "<<mm[temp]<<" fa = " << fa[mm[temp]] << " num = "<<num[fa[mm[temp]]]<<endl; if(mm[temp] == 0) printf("1\n"); else printf("%d\n", num[fa[mm[temp]]]); } int RMQ(int l, int r) { // printf("l = %d, r = %d\n", l, r); int k = 0; while((1 << (k + 1)) <= r - l + 1) k++; // printf("rmq1 = %d, rmq2 = %d, k = %d\n", rmq[l][k], rmq[r - (1 << k) + 1][k], k); return MIN(rmq[l][k], rmq[r - (1 << k) + 1][k]); } void solve3() { string str1, str2; cin >> str1 >> str2; // scanf("%s%s", str1, str2); int l = R[mm[str1]]; int r = R[mm[str2]]; if(l > r) swap(l, r); int ans = RMQ(l, r); if(ans == mm[str1]) ans = fa[ans]; else if(ans == mm[str2]) ans = fa[ans]; // printf("ans = %d\n", ans); // printf("%d\n", d[i]); cout << d[ans].name << endl; } int main() { // freopen("1010.in", "r", stdin); string str; int n; while(scanf("%d", &n) != EOF && n){ memset(gen, -1, sizeof(-1)); memset(num, 0, sizeof(num)); mm.clear(); for(int i = 0 ; i < n ; i++){ cin >> str; if(i == 0){ gen[0] = 0; d[i].init(str, i, 0); fa[i] = -1; mm[str] = i; } else{ int temp = 0; int j; for(j = 0 ; j < (int)str.length() ; j++){ if(str[j] != '.') break; temp++; } int len = str.length(); fa[i] = gen[temp - 1]; num[fa[i]]++; mm[str.substr(j, len - j)] = i; d[i].init(str.substr(j, len - j), i, temp); d[fa[i]].son.push_back(i); gen[temp] = i; } } for(int i = 0 ; i < n ; i++){ sort(d[i].son.begin(), d[i].son.end(), cmp); } RMQ_init(); // printf("B\n"); // for(int i = 0 ; i < cnt ; i++) // printf("%d ", B[i]); // printf("B\n"); // printf("R\n"); // for(int i = 0 ; i < n ; i++) // printf("%d ", R[i]); // printf("R\n"); int q; char ss[5]; scanf("%d", &q); while(q--){ scanf("%s", ss); if(ss[0] == 'L') solve1(); else if(ss[0] == 'b') solve2(); else if(ss[0] == 'c') solve3(); } } return 0; }
相关文章推荐
- 安卓的进程的优先级
- CentOS 7 使用点滴
- POJ 1011 Sticks(深搜+强剪枝)
- HDU 4292 最大流
- HDU 4289 最大流
- 虚方法
- PhoneGap笔记1
- ORACLE常用
- 常用类
- Scala深入浅出进阶经典 第46讲: ClassTag 、Manifest、ClassManifest、TypeTag代码实战及其在Spark中的应用源码解析
- HDU 4288 暴力
- MVC 分离Controllers-Views
- 开发者真机调试与应用发布
- poj2391 最大流+拆点
- oracle 两次购买时间间隔
- 抽象类与接口
- Scala深入浅出进阶经典 第45讲:Scala中Context Bounds代码实战及其在Spark中的应用源码解析
- appium for mobile web 之使用 ChromeDriver
- Linux TCP实现优化的背后想法
- Scala深入浅出进阶经典 第44讲:Scala中View Bounds代码实战及其在Spark中的应用源码解析