很少寫這種題目……這種題目體力消耗是大于技術含量的……
題意是這樣,給你兩個化學反應式,讓你判斷是否元素守恒 =_=
傳送門
比較關鍵的語法部分:
接下來就好辦了……挨層遞歸,把這個Formula變成若干sequence,然后把sequence變成 element;element變回sequence或者返回一個包含關鍵字[<chem>,1]的Treemap……然后遞歸回去,把TreeMap里面的東西乘NUMBER(如果有的話)逐層合并成一個TreeMap……
感覺上應該可以利用Scanner和正則表達式整的更簡單,但是我不知道括號里套括號的情況正則表達式會搞成什么樣(譬如:(Si(O)2),如果用類似(*)這樣的,匹配出來是(Si(O)還是(Si(O)2),如果我就想要后者應該怎么搞……求神人路過指點吧……)
題意是這樣,給你兩個化學反應式,讓你判斷是否元素守恒 =_=
傳送門
比較關鍵的語法部分:
- <formula> ::= [<number>] <sequence> { '+' [<number>] <sequence> }
- <sequence> ::= <element> [<number>] { <element> [<number>] }
- <element> ::= <chem> | '(' <sequence> ')'
- <chem> ::= <uppercase_letter> [ <lowercase_letter> ]
- <uppercase_letter> ::= 'A'..'Z'
- <lowercase_letter> ::= 'a'..'z'
- <number> ::= '1'..'9' { '0'..'9' }
接下來就好辦了……挨層遞歸,把這個Formula變成若干sequence,然后把sequence變成 element;element變回sequence或者返回一個包含關鍵字[<chem>,1]的Treemap……然后遞歸回去,把TreeMap里面的東西乘NUMBER(如果有的話)逐層合并成一個TreeMap……
感覺上應該可以利用Scanner和正則表達式整的更簡單,但是我不知道括號里套括號的情況正則表達式會搞成什么樣(譬如:(Si(O)2),如果用類似(*)這樣的,匹配出來是(Si(O)還是(Si(O)2),如果我就想要后者應該怎么搞……求神人路過指點吧……)
1 class Prob {
2
3 TreeMap<String,Integer> merge(TreeMap<String,Integer> a,
4 TreeMap<String,Integer> b , int cnt) {
5 for (Map.Entry<String,Integer> i : b.entrySet()) {
6 String pos = i.getKey();
7 int delta = a.get(pos) == null ? 0 : a.get(pos);
8 a.put(pos,delta + i.getValue()*cnt);
9 }
10 return a;
11 }
12
13 TreeMap<String,Integer> workElements(String now) {
14 if (now.charAt(0) == '(') {
15 return workSequence(now.substring(1,now.length()-1));
16 }
17 TreeMap<String,Integer> ans = new TreeMap<String,Integer>();
18 ans.put(now,1);
19 return ans;
20 }
21
22 TreeMap<String,Integer> workSequence(String now) {
23 TreeMap<String,Integer> ans = new TreeMap<String,Integer>();
24 while (now.length() > 0) {
25 int r = 1;
26 if (now.charAt(0) == '(') {
27 int cnt = 1;
28 while (cnt > 0){
29 if (now.charAt(r) == '(') cnt ++;
30 if (now.charAt(r) == ')') cnt --;
31 r++;
32 }
33 } else {
34 while (r < now.length()
35 && now.charAt(r) >= 'a' && now.charAt(r) <='z') {
36 r++;
37 }
38 }
39 String tmp = now.substring(0,r);
40 now = now.substring(r);
41 int cnt = 0;
42 while (now.length() > 0 && now.charAt(0) <= '9' && now.charAt(0) >='0') {
43 cnt = cnt * 10 + now.charAt(0) - '0';
44 now = now.substring(1);
45 }
46 if (cnt == 0) cnt = 1;
47 ans = merge(ans,workElements(tmp),cnt);
48 }
49 return ans;
50 }
51
52 TreeMap<String,Integer> workFormula (String now) {
53 TreeMap<String,Integer> ans = new TreeMap<String,Integer>();
54 StringTokenizer buf = new StringTokenizer(now,"+");
55 while (buf.hasMoreTokens()){
56 String tmp = buf.nextToken();
57 int cnt = 0;
58 while (tmp.charAt(0) <= '9' && tmp.charAt(0) >='0') {
59 cnt = cnt * 10 + tmp.charAt(0) - '0';
60 tmp = tmp.substring(1);
61 }
62 if (cnt == 0) cnt = 1;
63 ans = merge(ans,workSequence(tmp),cnt);
64 }
65 return ans;
66 }
67
68 void solve() throws IOException {
69 MyReader in = new MyReader();
70 String samp = in.next();
71 TreeMap<String,Integer> sampTree = workFormula(samp);
72 for (int ii = in.nextInt(); ii > 0; ii--) {
73 String now = in.next();
74 TreeMap<String,Integer> nowTree = workFormula(now);
75 System.out.print(samp);
76 if (nowTree.equals(sampTree)) {
77 System.out.print("==");
78 } else {
79 System.out.print("!=");
80 }
81 System.out.println(now);
82 }
83 //
.
84 }
85 void debug(Object
x) {
86 System.out.println(Arrays.deepToString(x));
87 }
88 }
2
3 TreeMap<String,Integer> merge(TreeMap<String,Integer> a,
4 TreeMap<String,Integer> b , int cnt) {
5 for (Map.Entry<String,Integer> i : b.entrySet()) {
6 String pos = i.getKey();
7 int delta = a.get(pos) == null ? 0 : a.get(pos);
8 a.put(pos,delta + i.getValue()*cnt);
9 }
10 return a;
11 }
12
13 TreeMap<String,Integer> workElements(String now) {
14 if (now.charAt(0) == '(') {
15 return workSequence(now.substring(1,now.length()-1));
16 }
17 TreeMap<String,Integer> ans = new TreeMap<String,Integer>();
18 ans.put(now,1);
19 return ans;
20 }
21
22 TreeMap<String,Integer> workSequence(String now) {
23 TreeMap<String,Integer> ans = new TreeMap<String,Integer>();
24 while (now.length() > 0) {
25 int r = 1;
26 if (now.charAt(0) == '(') {
27 int cnt = 1;
28 while (cnt > 0){
29 if (now.charAt(r) == '(') cnt ++;
30 if (now.charAt(r) == ')') cnt --;
31 r++;
32 }
33 } else {
34 while (r < now.length()
35 && now.charAt(r) >= 'a' && now.charAt(r) <='z') {
36 r++;
37 }
38 }
39 String tmp = now.substring(0,r);
40 now = now.substring(r);
41 int cnt = 0;
42 while (now.length() > 0 && now.charAt(0) <= '9' && now.charAt(0) >='0') {
43 cnt = cnt * 10 + now.charAt(0) - '0';
44 now = now.substring(1);
45 }
46 if (cnt == 0) cnt = 1;
47 ans = merge(ans,workElements(tmp),cnt);
48 }
49 return ans;
50 }
51
52 TreeMap<String,Integer> workFormula (String now) {
53 TreeMap<String,Integer> ans = new TreeMap<String,Integer>();
54 StringTokenizer buf = new StringTokenizer(now,"+");
55 while (buf.hasMoreTokens()){
56 String tmp = buf.nextToken();
57 int cnt = 0;
58 while (tmp.charAt(0) <= '9' && tmp.charAt(0) >='0') {
59 cnt = cnt * 10 + tmp.charAt(0) - '0';
60 tmp = tmp.substring(1);
61 }
62 if (cnt == 0) cnt = 1;
63 ans = merge(ans,workSequence(tmp),cnt);
64 }
65 return ans;
66 }
67
68 void solve() throws IOException {
69 MyReader in = new MyReader();
70 String samp = in.next();
71 TreeMap<String,Integer> sampTree = workFormula(samp);
72 for (int ii = in.nextInt(); ii > 0; ii--) {
73 String now = in.next();
74 TreeMap<String,Integer> nowTree = workFormula(now);
75 System.out.print(samp);
76 if (nowTree.equals(sampTree)) {
77 System.out.print("==");
78 } else {
79 System.out.print("!=");
80 }
81 System.out.println(now);
82 }
83 //

84 }
85 void debug(Object

86 System.out.println(Arrays.deepToString(x));
87 }
88 }