G化学方程式【noip模拟赛2】

描述

102班每天要写化学方程式,现在要想办法批改方程式。方程式中反应物的顺序可以不一样,中间可以有空格。不会出现沉淀和气体符号和反应条件。错误有系数不对(下标不对,如CO2为CO3也算系数不对。反应物或生成物中不会出现元素相同,系数不同的化学式,如:CO和CO2不会一起出现在反应物或生成物中),化学式错误,缺少反应物,两边元素不守恒。

输入

第一排输入N,M

第二排输入长度为N的字符串为正确方程式

第三排输入长度为M的字符串为要批改方程式

输出

正确输出RIGHT

错误第一排输出WRONG,第二排输出错误原因(只系数不对为1,其他错误和有两个以上错误为2)

输入样例 1

34 29
2Na O H + H2S O4 = Na 2 S O4+2H2O
H2S O4 +2NaO H =Na2 S O4+2H2O

输出样例 1

RIGHT

输入样例 2

34 25
2Na O H + H2S O4 = Na 2 SO4 +2H2O
H2S O4 +NaO H=2H2O +2 K Cl

输出样例 2

WRONG
2

提示

【数据规模】1<=N<=1001<=M<=100

来源:
来自 <http://www.dingbacode.com/contest/19/problem/G>

题解:
字符串处理,分别用数组记录正确式,批改式反应物、生成物的带系数和不带系数的各个成分,进行比较。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <iostream>
#include<bits/stdc++.h>
using namespace std;

char a[3][105][1005];
char b[3][105][1005];
char s[10005];
char a1[3][105][1005];
char b1[3][105][1005];

int main()
{

int n,m;
cin>>n>>m;

getchar();
fgets(s,10000,stdin);
int tot1[3]= {0};
int k=0;
int cur=0;
int cur1=0;

for(int i=0; i<n; i++)
{
if(s[i]==' ') continue;
if(s[i]=='=')
{
k=1;
cur1=cur=0;
continue;
}

if(s[i]=='+')
{
cur1=cur=0;
tot1[k]++;
continue;
}

a[k][tot1[k]][cur++]=s[i];
if(!(s[i]>='0'&&s[i]<='9')) a1[k][tot1[k]][cur1++]=s[i];
}

fgets(s,10000,stdin);
int tot2[3]= {0};
k=0;
cur1=cur=0;
for(int i=0; i<m; i++)
{
if(s[i]==' ')continue;
if(s[i]=='=')
{
k=1;
cur1=cur=0;
continue;
}

if(s[i]=='+')
{
cur1=cur=0;
tot2[k]++;
continue;
}

b[k][tot2[k]][cur++]=s[i];
if(!(s[i]>='0'&&s[i]<='9')) b1[k][tot2[k]][cur1++]=s[i];
}

if(tot1[0]!=tot2[0]||tot1[1]!=tot2[1])
{
cout<<"WRONG"<<endl<<2<<endl;
return 0;
}


int niu=0;


for(int i=0; i<=tot1[0]; i++)
{
int flag=0;

for(int j=0; j<=tot2[0]; j++)
{
if(!strcmp(a1[0][i],b1[0][j]))
if(!strcmp(a[0][i],b[0][j]))
{

flag=1;
break;
}
else {niu=1;flag=1;}

}

if(flag==0)
{
cout<<"WRONG"<<endl<<2<<endl;
return 0;
}
}


for(int i=0; i<=tot1[1]; i++)
{
int flag=0;

for(int j=0; j<=tot2[1]; j++)
{
if(!strcmp(a1[1][i],b1[1][j]))
if(!strcmp(a[1][i],b[1][j]))
{
flag=1;
break;
}
else {niu=1;flag=1;}
}
if(flag==0)
{
cout<<"WRONG"<<endl<<2<<endl;
return 0;
}
}

if(!niu)
cout<<"RIGHT"<<endl;
else cout<<"WRONG"<<endl<<1<<endl;
return 0;
}