每次取最长的最左边一段,可以使用优先队列来实现。而对于每次删除一段则可以使用链表来实现,事实上这里使用数组来模拟链表会有更好的效果。而且最后的评测使用g++会TLE(应该是我代码残了),使用c++可以过。
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
struct Node
{
char c;
int pos, len;
Node(char c, int a, int b)
{
this->c = c; pos = a; len = b;
}
};
bool operator<(const Node& a, const Node& b)
{
if (a.len == b.len) return a.pos > b.pos;
else return a.len < b.len;
}
const int MAXN = 1000005;
char s[MAXN];
int pre[MAXN], next[MAXN];
bool vis[MAXN];
priority_queue<Node> q;
int main()
{
scanf("%s", s);
int pos = 0, n = strlen(s);
while (s[pos] != '\0')
{
int st = pos, len = 1;
while (s[++pos] == s[st]) len++;
q.push(Node(s[st], st, len));
}
for (int i = 0;