#include #include char inp[100]; int minlevel,maxlevel; int found = 0; struct fract { int nr,dr; int width; }; int max(int x,int y) { if(x > y) return x; return y; } struct fract process(char* x,int level) { int len = 0; int i = 0; len = strlen(x); //now the return conditions if(len <= 1) { struct fract temp; temp.dr = 0; temp.nr = 0; temp.width = len; return temp; } //string does not hav / int slashfound = 0; int top = 0; for(i = 0;i < len;i++) { if(x[i] == '/' ) { slashfound = 1; break; } } if(!slashfound) { int count = 0; for(i = 0;i < len;i++) if(x[i] != '{' && x[i] != '}') count++; struct fract temp; temp.nr = 0; temp.dr = 0; temp.width = count; return temp; } if(minlevel > level) minlevel = level; if(maxlevel < level) maxlevel = level; found = 1; //if the string has / then return the max of the process of numerator and denominator char nr[100]; int nrlen = 0; char de[100]; int delen = 0; struct fract ans; ans.width = 0; ans.nr = 0; ans.dr = 0; //skip the non '{' symbols for(i = 0;i < len && x[i] != '{';i++,(ans.width)++); do { if(x[i] == '{') top++; else if(x[i] == '}') top--; nr[nrlen++] = x[i++]; }while(top > 0 && i < len); nr[nrlen-1] = '\0'; //now we hav the numerator if(x[i] == '/') { i++; do { if(x[i] == '{') top++; else if(x[i] == '}') top--; de[delen++] = x[i++]; }while(top > 0 && i < len); de[delen-1] = '\0'; struct fract x,y; x = process(nr+1,level+1); y = process(de+1,level-1); ans.width += 2 + max(x.width,y.width); ans.nr += 1 + x.nr + x.dr; ans.dr += 1 + y.nr + y.dr; } struct fract temp; temp = process(x+i,level); ans.nr = max(ans.nr,temp.nr); ans.dr = max(ans.dr,temp.dr); ans.width += temp.width; return ans; } int main() { scanf("%s",inp); struct fract ans; ans = process(inp,0); if(found) printf("%d %d",ans.width,1+ans.nr+ans.dr); else printf("%d 1",ans.width); return 0; }