NC212154. 单词记忆方法
描述
牛牛考完了四六级,准备分享一下自己的英语学习方法。
牛牛:学习英语最重要的就是背单词,如果你能把所有的单词都记住,那么你的英语就能变成天下第一。
然而牛牛的记忆方法就是把单词的每个字母转换成数字,把,依次类推,然后计算出来这个单词每个字母的和。从此每次想到这个单词,就要先想到这个单词的和,然后想办法凑出这个和。
不久后,牛牛又对自己的记忆方法进行了更新,可以把重复的连续字母进行合并,
比如把,这样计算和的时候只需要用里面的和乘个数就可以了,更加方便。(但是有时候牛牛由于老花眼没有发现几个相同的连续字母是重复的,所以导致他没进行合并)
输入描述
输出描述
示例1
输入:
(A2B2)2
输出:
12
C++14(g++5.4) 解法, 执行用时: 5ms, 内存消耗: 908K, 提交时间: 2020-10-05 21:19:58
#include<bits/stdc++.h> using namespace std; typedef long long ll; string s; ll i=0,lens; ll solve() { ll res=0,a=0; for(; i<lens; i++) { ll cnt=0; while(isdigit(s[i])) cnt = cnt*10+(s[i++]-'0'); res += a*max(cnt,(ll)1); a=0; if(isalpha(s[i])) a = s[i]-'A'+1; else if(s[i]=='(') i++,a = solve(); else if(s[i]==')') break; } res+=a; return res; } int main() { cin>>s; lens=s.length(); cout<<solve()<<endl; }
C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 856K, 提交时间: 2020-09-27 11:51:07
#include<bits/stdc++.h> #define ll long long using namespace std; int i=0; string s; ll solve(){ ll res=0,a=0; for(;i<s.size();i++){ ll tmp=0; while(isdigit(s[i])) tmp=tmp*10+(s[i++]-'0'); res+=a*max(tmp,1LL); a=0; if(isalpha(s[i])) a+=s[i]-'A'+1; if(s[i]=='(') i++,a=solve(); else if(s[i]==')') break; } res+=a; return res; } int main(){ cin>>s; cout<<solve()<<endl; }