題意:有一個字符串,如果一個字符和它相鄰的字符是不同的話,就把它們都消除,問最多能進行幾次操作。如aabb,能進行2次操作。
題解:先把相鄰的同一種字符和它的個數數出來。然後進行模擬。每次模擬後,再進行合併。
#pragma warning(disable:4996)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
struct node
{
char r;
int num;
};
node p[1000005];
char s[1000005];
void merge(int &k)//合併操作
{
int k1=0, i;
//找出第一個存在的字符
for (i = 0; i <= k; i++)
{
if (p[i].num > 0)
{
p[0].num = p[i].num;
p[0].r = p[i].r;
break;
}
}
i++;
for (;i <= k; i++)
{
if (p[i].num > 0)
{
if (p[i].r != p[k1].r)p[++k1] = p[i];
else p[k1].num += p[i].num;//相同就直接加上次數
}
}
k = k1;
}
int main()
{
int n, i, j, k, cnt;
while (scanf("%s", s) == 1)
{
cnt = 0;
n = strlen(s);
k = 0;
p[0].r = s[0]; p[0].num = 1;
for (i = 1; i < n; i++)
{
if (s[i] == s[i - 1])p[k].num++;
else
{
p[++k].r = s[i];
p[k].num++;
}
}
while (1)
{
if (k <= 0)break;//是k<=0結束,因爲k是從0開始的
for (i = 1; i < k; i++)
{
p[i].num -= 2;
}//中間少兩個
p[0].num--; p[k].num--;//前後少一個
cnt++;
merge(k);
}
cout << cnt << endl;
}
return 0;
}