列表

详情


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;
}

上一题