p1466.cpp
来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 120 行
CPP
120 行
// p1466.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <stdio.h>
#include <ctype.h>
#include <string.h>
struct TData {
int len;
char Name [40] [3];
int Num [40];
int find ( char p [] );
void add ( char p [] , int value );
};
struct TNode {
char Str [200] , StrLen;
TData Data;
void Search ( int left , int right , int w );
void Work ();
bool EqualTo ( TNode & a );
} Dic , Temp;
bool TNode :: EqualTo ( TNode &a )
{
if ( Data.len != a.Data.len ) return false;
int i , tmp;
for ( i = 0; i < Data.len; i ++ ) {
tmp = a.Data.find ( Data.Name [i] );
if ( tmp != Data.Num [i] ) return false;
}
return true;
}
int TData :: find ( char p [] )
{
int i;
for ( i = 0; i < len; i ++ ) if ( strcmp ( p , Name [i] ) == 0 ) return Num [i];
return -1;
}
void TData :: add ( char p [] , int value )
{
int i;
for ( i = 0; i < len; i ++ ) if ( strcmp ( p , Name [i] ) == 0 ) {
Num [i] += value; return;
}
strcpy ( Name [len] , p );
Num [len ++] = value;
}
void TNode :: Search ( int left , int right , int w )
{
int tmp , i , j , have;
char p [3];
if ( Str [left] == '(' ) {
for ( have = 1 , i = left + 1; have ; i ++ )
if ( Str [i] == '(' ) have ++; else
if ( Str [i] == ')' ) have --;
for ( tmp = 0 , j = i; j <= right && isdigit ( Str [j] ); j ++ ) tmp = tmp * 10 + Str [j] - '0';
if ( tmp == 0 ) tmp = 1;
if ( j <= right ) Search ( j , right , w );
Search ( left + 1 , i - 2 , w * tmp );
} else
if ( isdigit ( Str [left] ) ) {
for ( tmp = 0; isdigit ( Str [left] ); left ++ ) tmp = tmp * 10 + Str [left] - '0';
Search ( left , right , w * tmp );
} else {
if ( islower ( Str [left + 1] ) ) p [0] = Str [left] , p [1] = Str [left + 1] , p [2] = 0 , left += 2;
else p [0] = Str [left] , p [1] = 0 , left ++;
for ( tmp = 0; left <= right && isdigit ( Str [left] ); left ++ ) tmp = tmp * 10 + Str [left] - '0';
if ( tmp == 0 ) tmp = 1;
Data.add( p , w * tmp );
if ( left <= right ) Search ( left , right , w );
}
}
void TNode :: Work ()
{
int i , j;
StrLen = strlen ( Str );
for ( i = 0; i < StrLen; i = j + 1 ) {
for ( j = i + 1; j < StrLen && Str [j] != '+'; j ++ );
Search ( i , j - 1 , 1 );
}
}
void print ( TNode &a )
{
int i;
printf ( "Len = %d\n" , a.Data.len );
for ( i = 0; i < a.Data.len; i ++ )
printf ( "name = %s num = %d\n" , a.Data.Name [i] , a.Data.Num [i] );
}
int main(int argc, char* argv[])
{
int total , N , i;
for ( scanf ( "%d" , &total ); total; total -- ) {
scanf ( "%s" , Dic.Str ); Dic.Data.len = 0;
Dic.Work ();
scanf ( "%d" , &N );
for ( i = 0; i < N; i ++ ) {
scanf ( "%s" , Temp.Str ); Temp.Data.len = 0;
Temp.Work ();
if ( Temp.EqualTo ( Dic ) ) printf ( "%s==%s\n" , Dic.Str , Temp.Str );
else printf ( "%s!=%s\n" , Dic.Str , Temp.Str );
}
if ( total > 1 ) printf ( "\n" );
}
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?