NC205726. L1-8幻想乡炼金学
描述
幻想乡里面有一些神秘的炼金术士,为了"make 幻想乡 great again",建设和谐幻想乡,他们对一些神奇的材料进行了分析,得到了其炼金式,你能帮炼金术士们处理一下这些炼金式么?
幻想乡炼金学原理如下:
你需要做的是:
输入描述
一行内输入一个合法的炼金式,只包含大小写字母,数字和空格,不超过150个字符。
输出描述
一行内输出一个整数,表示转换后的炼金式。
示例1
输入:
Fe{2} (SO){3}
输出:
FeFeSSSOOO
Java(javac 1.8) 解法, 执行用时: 73ms, 内存消耗: 12876K, 提交时间: 2020-05-05 08:46:04
import java.math.*; import java.util.*; public class Main { public static void main(String[] args) { String[] ch = new String[500]; int[] num = new int[500]; Scanner in = new Scanner(System.in); String s = in.nextLine(); s = s.replaceAll("[^0-9A-Za-z{}()]+", ""); ch = s.split("[{}0-9]+"); String[] n = s.split("[^0-9]+"); for (int i=0; i<n.length; i++) { if (i == n.length-1) { break; } num[i] = Integer.valueOf(n[i+1]); } for (int i=0; i<num.length; i++) { if (0 == num[i]) { num[i] = 1; } } for (int i=0; i<ch.length; i++) { if (ch[i].charAt(ch[i].length()-1) == ')') { String[] t = ch[i].split("[()]+"); //for (int j=0; j<t.length; j++) System.out.println(t[j]); for (int j=0; j<t.length; j++) { if (j == t.length-1) { String[] tt = t[j].split("(?=\\p{Upper})"); for (int k=0; k<tt.length; k++) { for (int l=0; l<num[i]; l++) { System.out.print(tt[k]); } } } else { System.out.print(t[j]); } } } else { ch[i] = ch[i].replaceAll("[()]+", ""); String[] t = ch[i].split("(?=\\p{Upper})"); for (int j=0; j<t.length; j++) { if (j == t.length-1) { for (int k=0; k<num[i]; k++) { System.out.print(t[j]); } } else { System.out.print(t[j]); } } } } } }
C++14(g++5.4) 解法, 执行用时: 7ms, 内存消耗: 496K, 提交时间: 2020-05-11 20:10:41
#include <iostream> #include <string> #include <vector> using namespace std; string atom(const string &s,int &st); int num(const string &s,int &st); int main(){ string str,s; getline(cin,str); for (int i=0;i<(int)str.size();i++) { if (str[i]!=' ') { s+=str[i]; } } int n=s.size(); string ans; for(int i=0;i<n;){ if(s[i]>='A'&&s[i]<='Z'){ string a=atom(s,i); if(i<n && s[i]=='{'){ int c=num(s,i); i++; for(int j=0;j<c;j++){ ans+=a; } }else{ ans+=a; } }else if(s[i]=='('){ vector<string> v; i++; while (i<n && s[i]!=')') { string ss=atom(s,i); v.push_back(ss); } i++; int m=num(s,i); i++; int v1=v.size(); for (int j=0;j<(int)v.size();j++) { for (int k=0;k<m;k++) { ans+=v[j]; } } } } cout<<ans<<endl; return 0; } string atom(const string &s,int &st){ string t; t+=s[st++]; while(st<s.size() && s[st]>='a' && s[st]<='z'){ t+=s[st++]; } return t; } int num(const string &s,int &st){ int i=0; st++; while(st<s.size() && s[st]>='0' && s[st]<='9') i=i*10+s[st++]-'0'; return i; }
C++ 解法, 执行用时: 3ms, 内存消耗: 472K, 提交时间: 2021-10-06 20:13:03
#include <iostream> #include <algorithm> using namespace std; string str; void read() { string s; while (cin >> s) { for (int i = 0; i < s.size(); ++i) { if (s[i] != '{' && s[i] != '}') { str += s[i]; } } } } int main() { read(); reverse(str.begin(), str.end()); string res; for (int i = 0; i < str.size(); ++i) { if (str[i] > 47 && str[i] < 58) { int v = 0, j = i; while (str[j] > 47 && str[j] < 58) ++j; for (int k = j - 1; k >= i; --k) v = v * 10 + (str[k] ^ 48); string r; if (str[j] == ')') { ++j; while (str[j] != '(') { r = ""; do r += str[j]; while (str[j++] > 96); for (int k = 0; k < v; ++k) res += r; } } else { do r += str[j]; while (str[j++] > 96); while (v--) res = res + r; --j; } i = j; } else if (str[i] != '(' && str[i] != ')') res += str[i]; } reverse(res.begin(), res.end()); cout << res << '\n'; return 0; }