📄 3108.txt
字号:
Source
Problem Id:3108 User Id:fzk
Memory:1024K Time:410MS
Language:C++ Result:Accepted
Source
#include <stdio.h>
#include <memory.h>
#include <string>
#include <map>
#include <vector>
using namespace std;
struct HornClause {
int false_var;
int dest;
}hc[11000];
vector< HornClause* > e[11000];
int q[11000], qh, qe, hn;
bool sign[11000];
map<string, int> m;
vector<int> var;
int get( char *name ) {
int t;
map< string, int >::iterator iter = m.find( name );
if( iter != m.end() )
return iter->second;
else {
t = m.size();
e[t].clear();
m.insert( make_pair( string(name), t ) );
return t;
}
}
char name[20010];
void parse( char *w ) {
int t, i;
bool key;
do{
key = false;
do {
w++;
for( i=0; *w <= 'Z' && *w >= 'A'; i++ )
name[i] = *w++;
if( i == 0 )
var.push_back( 1 );
else {
name[i] = '\0';
var.push_back( get( name ) );
}
}while( *w == '&' );
w++;
w++;
for( i=0; *w <= 'Z' && *w >= 'A'; i++ )
name[i] = *w++;
if( i == 0 )
t = 0;
else {
name[i] = '\0';
t = get( name );
}
hc[hn].false_var = var.size();
hc[hn].dest = t;
for( i=0; i<var.size(); i++ )
e[var[i]].push_back( &hc[hn] );
hn++;
var.clear( );
w++;
}while( *w++ == '&' );
return;
}
char w[20010];
bool init( ) {
if( scanf( "%s", w ) == EOF )
return false;
m.clear( );
m.insert( make_pair(string("0"), 0) );
m.insert( make_pair(string("1"), 1) );
e[0].clear( );
e[1].clear( );
qh = qe = 0;
q[qe++] = 1;
memset( sign, 0, sizeof sign );
sign[1] = true;
hn = 0;
parse( w );
return true;
}
void doit( ) {
int i, t;
bool ans;
ans = true;
while( qh < qe && ans ) {
t = q[qh++];
for( i=0; i<e[t].size(); i++ ) {
HornClause *p = e[t][i];
p->false_var--;
if( p->false_var == 0 && !sign[ p->dest ] ) {
if( p->dest == 0 ) {
ans = false;
break;
}
q[qe++] = p->dest;
sign[ p->dest ] = true;
}
}
}
if( !ans )
printf( "unsatisfiable\n" );
else {
bool first = false;
for( map<string,int>::iterator it=m.begin(); it != m.end(); it++ ) {
if( it->second > 1 ) {
if( first )
printf( "," );
first = true;
printf( "%s=%s", it->first.c_str(), sign[ it->second ]?"true":"false" );
}
}
printf( "\n" );
}
}
int main( ) {
while( init() )
doit( );
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -