Codeforces Round #455 (Div. 2)D. Colorful Points[模拟]

题目:http://codeforces.com/contest/909/problem/D

题意:每次操作可以选择任意个数的字母,只要那个字母和相邻的一个字母不相同,就可以删去自身和不相同的1或2个字母,问需要多少次操作使得无法继续删除。

分析:每次删除只能删除一个连续相同区段的左端点和右端点(除了序列两端),用pair存一个字母连续出现的长度,每次暴力扫,让序列两端的长度-1,剩下的长度-2,复杂度O(n)

代码:

 1 #define _CRT_SECURE_NO_DEPRECATE
 2 #pragma comment(linker, "/STACK:102400000,102400000")
 3 #include<iostream>  
 4 #include<cstdio>  
 5 #include<fstream>  
 6 #include<iomanip>
 7 #include<algorithm>  
 8 #include<cmath>  
 9 #include<deque>  
10 #include<vector>
11 #include<bitset>
12 #include<queue>  
13 #include<string>  
14 #include<cstring>  
15 #include<map>  
16 #include<stack>  
17 #include<set>
18 #include<functional>
19 #define pii pair<int, int>
20 #define mod 1000000007
21 #define mp make_pair
22 #define pi acos(-1)
23 #define eps 0.00000001
24 #define mst(a,i) memset(a,i,sizeof(a))
25 #define all(n) n.begin(),n.end()
26 #define lson(x) ((x<<1))  
27 #define rson(x) ((x<<1)|1) 
28 #define inf 0x3f3f3f3f
29 typedef long long ll;
30 typedef unsigned long long ull;
31 using namespace std;
32 string a;
33 
34 
35 int main()
36 {
37     ios::sync_with_stdio(false);
38     cin.tie(0); cout.tie(0);
39     int i, j, k, m, n;
40     cin >> a;
41     vector<pii>v;
42     for (int i = 0; i < a.size(); ++i)
43     {
44         if (v.empty())v.push_back(mp(a[i], 1));
45         else
46         {
47             if (v[v.size() - 1].first == a[i])v[v.size() - 1].second++;
48             else v.push_back(mp(a[i], 1));
49         }
50     }
51     int ans = 0;
52     while (v.size() > 1)
53     {
54         ans++;
55         vector<pii>temp;
56         for (int i = 0; i < v.size(); ++i)
57         {
58             if (i == 0 || i == v.size() - 1)v[i].second--;
59             else v[i].second -= 2;
60         }
61         for (auto it : v)
62         {
63             if (it.second <= 0)continue;
64             else
65             {
66                 if (temp.empty())temp.push_back(it);
67                 else if (it.first == temp[temp.size() - 1].first)temp[temp.size() - 1].second += it.second;
68                 else temp.push_back(it);
69             }
70         }
71         v = temp;
72     }
73     cout << ans << endl;
74     return 0;
75 }

 

posted @ 2017-12-28 14:42  Meternal  阅读(372)  评论(0编辑  收藏  举报