codeforces909d 字符串模擬

題意:有一個字符串,如果一個字符和它相鄰的字符是不同的話,就把它們都消除,問最多能進行幾次操作。如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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章