2269:Friends
keyword
集合 構文解析 C
概要
和と差と積の入った集合演算をする問題。
集合の個数が26個以下なのでビットで扱う。構文解析の部分は、よくあるBNFで定義してから実装した。
int n, p; char str[300]; int expr(); int term(); int fact(); int set(); int expr(){ int a,b; char op; if(!str[p]) return -1; a = term(); while( op = str[p++] ){ if(op=='+'){ b = term(); a |= b; } else if(op=='-'){ b = term(); a &= ~b; } else break; } p--; return a; } int term(){ int a, b; char op; if(!str[p]) return -1; a = fact(); while( (op=str[p++]) == '*'){ b = fact(); a &= b; } p--; return a; } int fact(){ int a; if(str[p] == '('){ p++; a = expr(); if(str[p]==')'){ p++; return a; } else{ return -1; } } a = set(); return a; } int set(){ int a=0; if(str[p++]=='{'){ while('A'<=str[p]&&str[p]<='Z'){ a |= 1<<(str[p++]-'A'); } p++; return a; } return -1; } int main(){ int ans,i; while(scanf("%s\n",str)!=EOF){ p = 0; ans = expr(); putchar('{'); for(i=0;i<26;i++)if((ans>>i)&1) putchar(i+'A'); puts("}"); } }