#include #include #include #include using namespace std; FILE *in = fopen("fool.in", "r"); char line[500]; int pos, rpos; bool set(); vector > sets; vector > lists; bool element() { //printf("element[%d-%d]\n", pos, rpos); if (pos == rpos) return true; bool b = set(); //printf("element[%d-%d] %s\n", pos, rpos, b?"true":"false"); return b; } bool list() { if (lists[pos][rpos] != -1) return lists[pos][rpos]==1; int oldrpos = rpos; int oldpos = pos; for(int i = pos; i <= oldrpos; ++i) { if (i > oldpos && line[i] != '}') continue ; if (i < oldrpos && line[i+1] != ',') continue ; //printf("list[%d-%d] - %d\n", oldpos, oldrpos, i); pos = oldpos; rpos = i; if (element()) { if (i == oldrpos) { lists[oldpos][oldrpos] = 1; return true; } if (line[i+1] == ',') { pos = i+2; rpos = oldrpos; if (list()) { lists[oldpos][oldrpos] = 1; return true; } //printf("element ok. but not rest\n"); } } } //printf("list[%d-%d] false\n", oldpos, oldrpos); lists[oldpos][oldrpos] = 0; return false; } bool elementlist() { //printf("elementlist[%d-%d]\n", pos, rpos); if (pos >= rpos) return true; bool b = list(); //printf("elementlist[%d-%d] %s\n", pos, rpos, b ? "true":"false"); return b; } bool set() { if (sets[pos][rpos] != -1) return sets[pos][rpos]==1; //printf("set[%d-%d]\n", pos, rpos); if (line[pos] != '{') { //printf("set[%d-%d] false\n", pos, rpos); return false; } if (line[rpos] != '}') { //printf("set[%d-%d] false\n", pos, rpos); return false; } pos ++; rpos --; bool b = elementlist(); sets[pos-1][rpos+1] = b ? 1 : 0; //printf("set[%d-%d] %s\n", pos, rpos, b?"true":"false"); return b; } int main() { int n; fscanf(in, "%d", &n); fgets(line, sizeof(line), in); for(int k = 0; k< n; ++k) { fgets(line, sizeof(line), in); pos = 0; rpos = strlen(line)-2; sets.assign(rpos+1, vector(rpos+1, -1)); lists.assign(rpos+1, vector(rpos+1, -1)); for(int i = 0; i < rpos; ++i) { if (line[i] == line[i+1] && line[i] == '}') sets[i][i+1] = 1; if (line[i] == line[i+2] && line[i] == '}') sets[i][i+2] = 1; lists[i][i] = 1; } if (!set()) printf("Word #%d: No Set\n", k+1); else printf("Word #%d: Set\n", k+1); } return 0; }