e504 - 12195 - Jingle Composing
題目描述
題目要求計算給定的音樂字串中,有多少個小節的音符持續時間總和為 1。音樂字串由音符(W, H, Q, E, S, T, X)和分隔符號 '/' 組成。每個音符對應不同的持續時間,小節由 '/' 分隔。
解題思路
程式碼透過模擬的方式解析音樂字串。它遍歷字串中的每個字元,並根據字元類型進行處理:
- 如果遇到 '*', 則結束輸入。
- 如果遇到 '\n',則輸出目前計算的小節數量,並重置計數器。
- 如果遇到 '/',則檢查前一個字元是否為 'W' (代表 64),如果是,則增加小節計數器。
- 如果遇到音符字元 (W, H, Q, E, S, T, X),則根據音符的對應值更新一個暫存變數
c。 - 其他情況下,增加
c的值。
程式碼的核心邏輯在於計算每個小節的持續時間,並在遇到 '/' 時判斷該小節的持續時間是否為 1。
複雜度分析
- 時間複雜度: O(n),其中 n 是輸入字串的長度。程式碼需要遍歷整個字串一次。
- 空間複雜度: O(1),程式碼只使用了常數個額外的變數。
程式碼
#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <stdio.h>
inline void write(int x) {
if(x==0){
putchar_unlocked('0');
return;
}
int stk[9],*ptr(&stk[0]);
while(x){*ptr=x%10;x/=10;++ptr;}
while(--ptr>=(&stk[0])){putchar_unlocked(*ptr+'0');}
}
int main(){
char a,c,ans;
while(a=getchar_unlocked()){
if(a=='*')break;
else if(a=='\n'){
write(ans);
putchar_unlocked('\n');
ans=0;
}
else if(a=='/'){
if(c==64)++ans;
c=0;
}
else if(a=='W')c+=64;
else if(a=='H')c+=32;
else if(a=='Q')c+=16;
else if(a=='E')c+=8;
else if(a=='S')c+=4;
else if(a=='T')c+=2;
else ++c;
}
}