题
OvO http://codeforces.com/contest/909/problem/D
CF 455 div2 D
CF 909D
解
算出模拟的复杂度之后就是一个很水的模拟题
把字符串按照类似于行程编码的方式来表示,例如把 aaaabbccc 表示成 [4*a] [2*b] [3*c] 这样的形式([4*a] 这个用一个结构体表示)
接下去就可以开心地敲模拟了,
例如对于 [5*a] [4*b] [2*c] [4*b] 这样一个表,
运行一次之后就变成了 [4*a] [2*b] [0*c] [3*b]
然后进行压缩 变成 [4*a] [5*b]
重点是复杂度的计算,每当你进行一次 O(1) 的操作(遍历数组,删除元素)时候,元素的总量(按 aabbc 是 5 个元素这样算)也会减1,所以总的复杂度是 O(n) 的,并不会超时
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; const int M=1e6+44; struct Node { int val,num; } q[M]; int lq; char str[M]; void cps() { int k=lq; lq=0; for(int i=1;i<=k;i++) if(q[i].num>0) { if(q[i].val==q[lq].val) q[lq].num+=q[i].num; else q[++lq]=q[i]; } } void solve() { int ans=0; while(lq>1) { ans++; for(int i=2;i<lq;i++) q[i].num-=2; q[1].num--,q[lq].num--; cps(); } printf("%d ",ans); } int main() { scanf("%s",str+1); lq=strlen(str+1); q[0].val=-1; for(int i=1;i<=lq;i++) q[i].val=str[i]-'a',q[i].num=1; cps(); solve(); return 0; }