1. 程式人生 > >Codeforces 909 D. Colorful Points (模擬)

Codeforces 909 D. Colorful Points (模擬)

for 化簡 http eof div aaa pre 刪除 nts

題目鏈接: 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 }

Codeforces 909 D. Colorful Points (模擬)