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 }