题目链接: 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 }