單詞記憶方法
題目描述
牛牛考完了四六級,準備分享一下自己的英語學習方法。
牛牛:學習英語最重要的就是背單詞,如果你能把所有的單詞都記住,那麼你的英語就能變成天下第一。
然而牛牛的記憶方法就是把單詞的每個字母轉換成數字,把a看成1,b看成2,c看成3依次類推,然後計算出來這個單詞每個字母的和。從此每次想到這個單詞,就要先想到這個單詞的和,然後想辦法湊出這個和。
不久後,牛牛又對自己的記憶方法進行了更新,可以把重複的連續字母進行合併,
比如把abcabc寫成(abc)2,hhhh寫成(h2)2或者h4{}abcabc寫成(abc)2,hhhh寫成(h2)2或者h4,這樣計算和的時候只需要用裡面的和乘個數就可以了,更加方便。(但是有時候牛牛由於老花眼沒有發現幾個相同的連續字母是重複的,所以導致他沒進行合併)
現在到了牛牛考驗你的時間了,牛牛告訴你乙個單詞,這個單詞可能很長甚至你從來沒見過,但牛牛要你按他的方法算出這個單詞的和。
輸入描述:
輸入僅有一行,表示牛牛給你的這個單詞s{}輸入僅有一行,表示牛牛給你的這個單詞s
∣ s∣
<=1
05
|s|<=10^5
∣s∣<=1
05s中只包含大寫字母,左右括號以及數字,不包含其他字元
輸出描述:
輸出一行,表示這個單詞的和{}輸出一行,表示這個單詞的和
保證這個和不大於10^保證這個和不大於10
14示例1
輸入
(a2b2)2
輸出12
備註:
括號可能會巢狀出現
括號或者字母後面的數字也可能不止一位數,也可能沒有數字,沒有數字就表示為出現1次,但是這個數不可能為0
題解:直接dfs進行搜尋,詳細邏輯見**。
c++ ac **
#include
typedef
long
long ll;
using
namespace std;
const
int max_n =
1e6+10;
char s[max_n]
;int n, i;
ll dfs()
ans +
= num *
(cnt >
0? cnt :1)
;// 之前出現過的字母乘以它後面的數字,如果它後面沒有跟數字,那麼就預設為1
num =0;
// 每計算完乙個字元之後將它重置為0if(
isalpha
(s[i]))
// 如果當前位置是字母,計算它對應的值
num = s[i]
-'a'+1
;else
if(s[i]
=='('
)// '(' 標記著開始,進行dfs
else
// ')' 的情況,退出迴圈
break;}
ans +
= num;
return ans;
}int
main()
自己寫的時候第一反應是用棧,但是後來發現邏輯死活都沒有理清楚,也就不了了了之了。。。然後看了大佬的題解,把他的**搬過來用了用。。。。 牛客小白月賽28
計算模意義下的 1 frac 即可。include using namespace std const int mod 1e9 7 int binpow int a,int b return res int inv int n int main return0 以此類推,最終推得規律為 x 3 y ...
牛客小白月賽3
a 我們規定母音字母有a e i o u,並且規定半母音字母y也是母音字母。cwbc在學習英語,xhrlyb為了讓cwbc的記憶更加深刻,於是她讓cwbc把每個字串的所有字母都變成乙個恰好不大於它本身的小寫母音字母。可是cwbc比較貪玩,並且他想讓你幫他完成這個任務。聰明的你在仔細閱讀題目後,一定可...
牛客小白月賽6
c 挑花 dfs或bfs 桃花一簇開無主,可愛深紅映淺紅。題百葉桃花 桃花長在桃樹上,樹的每個節點有乙個桃花,調皮的htbest想摘盡可能多的桃花。htbest有乙個魔法棒,摘到樹上任意一條鏈上的所有桃花,由於htbest法力有限,只能使用一次魔法棒,請求出htbest最多可以摘到多少個桃花。第一行...