有一个串,有黑色和白色两种元素。一次操作可以把最上面的白色元素变成黑色,同时把这个元素上面的所有元素变成白色。
给你一个30以内的串,计算变成全黑时,元素变化的总和。
我用的方法比较笨,打表处理了1-30个全白串变黑的ans,然后模拟,借助打表的结果计算出答案。
其实,每出现一个白色元素 cnt+=(1<<i+1)-1即可;
1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 5 using namespace std; 6 7 int T,N; 8 char str[100]; 9 int flag; 10 long long ans; 11 int table[35] = {0,1,4,11,26,57,120,247,502,1013,2036,4083,8178,16369,32752,65519,131054,262125,524268,1048555,2097130,4194281,8388584 12 ,16777191,33554406,67108837,134217700,268435427,536870882,1073741793,2147483616}; 13 int main() 14 { 15 scanf("%d",&T); 16 while(T--) 17 { 18 scanf("%d%s",&N,str); 19 ans = 0; 20 while(true) 21 { 22 flag = 0; 23 //printf("str:%s ",str); 24 for(int i=0;i<N;i++) 25 { 26 if(str[i]=='W') 27 { 28 for(int j=0;j<i;j++) 29 { 30 if(str[j] == 'B') 31 ans++; 32 else if(str[j] == 'W') 33 str[j] == 'B'; 34 } 35 ans += table[i]; 36 37 str[i] = 'B'; 38 ans++; 39 40 flag = 1; 41 break; 42 } 43 } 44 45 if(!flag) 46 { 47 printf("%lld ",ans); 48 break; 49 } 50 } 51 } 52 }