Uva - 11988 - Broken Keyboard (a.k.a. Beiju Text)
用链表,不必用结构体方式,太麻烦,直接用数组把字符串存起来,比如字符数组为s,用next[i]表示当前字符下一个应该显示字符的位置,就OK了。
直接用数组做,然后插入的时候移动数组是很不好的,很有可能超时,每次移动耗费时间太多。
AC代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cctype> #include <cstring> #include <string> #include <sstream> #include <vector> #include <set> #include <map> #include <algorithm> #include <stack> #include <queue> #include <bitset> #include <cassert> using namespace std; const int maxn = 100005; int last, cur, nextP[maxn]; // 光标在cur号字符后面 char s[maxn]; int main() { while (scanf("%s", s + 1) == 1) { int n = strlen(s + 1); last = cur = 0; nextP[0] = 0; for (int i = 1; i <= n; i++) { char ch = s[i]; if (ch == '[') { cur = 0; } else if (ch == ']') { cur = last; } else { nextP[i] = nextP[cur]; nextP[cur] = i; if (cur == last) { // 更新最后一个字符编号 last = i; } cur = i; // 移动光标 } } for (int i = nextP[0]; i != 0; i = nextP[i]) { printf("%c", s[i]); } cout << endl; } return 0; }