列表

详情


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

上一题