Codeforces 909 D. Colorful Points (模拟)

题目链接: Colorful Points

题意:

  给出一段字符串(长度最大为1e6),每次操作可以删除字符串中所有相邻字符与其不同的字符。例如:aabcaa 删除一次就变成了aa,就无法再删除了。题目要求所给出的字符串要操作几次后才无法操作。

题解:

  可以把整个字符串化简为相邻字符都不同的串,把每个位置字符的个数记录下来,比如aaaabbbbccccdddd -> [4*a][4*b][4*c][4*d]。然后暴力求。@。@这题比我想象中的也暴力太多了,妈耶,刷新了我对D题的认知。

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int MAX_N = 1e6+9;
 4 const int MOD = 1e9+7;
 5 char vec[MAX_N];
 6 int res[MAX_N];
 7 char tran[MAX_N];
 8 int main()
 9 {
10     int N,M,T;
11     while(~scanf("%s",vec))
12     {
13         memset(res,0,sizeof(res));
14         int len = strlen(vec);
15         int pos = 0;
16         res[0] = 1;
17         char pre = vec[0];
18         tran[pos] = pre;
19         for(int i=1;i<len;i++)
20         {
21             if(vec[i] == pre) res[pos] ++;
22             else
23             {
24                 res[++pos] = 1;
25                 pre = vec[i];
26                 tran[pos] = pre;
27             }
28         }
29 
30         int num = pos + 1;
31         int ans = 0;
32         while(num > 1)
33         {
34             res[0] -= 1;
35             res[num-1] -= 1;
36             for(int i=1;i<num-1;i++)
37             {
38                 res[i] -= 2;
39             }
40             int t = 0;
41             for(int i=0;i<num;i++)
42             {
43                 if(res[i]>0)
44                 {
45                     if(t>0 && tran[t-1] == tran[i])
46                     {
47                         res[t-1] += res[i];
48                     }
49                     else
50                     {
51                         res[t] = res[i];
52                         tran[t++] = tran[i];
53                     }
54                 }
55             }
56             num = t;
57             ans ++;
58         }
59         cout<<ans<<endl;
60     }
61     return 0;
62 }

 

posted @ 2018-01-31 12:04  会打架的程序员不是好客服  阅读(323)  评论(0编辑  收藏  举报