首先看范围 说明这题应该在
范围的时间复杂度,那么想到一共最多n个字符需要删除,且保证删除时间在
。于是想到用双链表来实现删除操作。还有很多细节见代码。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int n;
char str[N];
int l[N], r[N];
vector <int> w, q;
bool visited[N];
void insert(int x)
{
if (!visited[x])
{
visited[x] = true;
w.push_back(x);
}
}
void Initialization()
{
w.clear();
for (int k : q)
{
int a = l[k], b = k, c = r[k];
if (str[a] == str[b] && str[b] != str[c] && c != n + 1)
{
insert(b);
insert(c);
}
if (str[a] != str[b] && str[b] == str[c] && a != 0)
{
insert(a);
insert(b);
}
}
}
int main()
{
scanf("%s", str + 1);
n = strlen(str + 1);
str[0] = str[n + 1] = '@';
for (int i = 1; i <= n; ++ i)
{
l[i] = i - 1, r[i] = i + 1;
q.push_back(i);
}
l[n + 1] = n, r[0] = 1;
while (true)
{
Initialization();
if (w.empty()) break;
q.clear();
for (int k : w)
{
int a = l[k], b = k, c = r[k];
if (!visited[a] && a != 0 && (q.empty() ||q.back() != a)) q.push_back(a);
if (!visited[c] && c != n + 1) q.push_back(c);
l[c] = a, r[a] = c;
}
}
if (r[0] == n + 1) puts("EMPTY");
else
{
for (int i = r[0]; i != n + 1; i = r[i])
cout << str[i];
}
return 0;
}