#include #include #include using namespace std; const int maxn=50000; int T,kase,cnt; char input[maxn*6+5],*p; int done[maxn]; struct Node { string s; int hash,left,right; bool operator<(const Node& rhs) const { if(hash!=rhs.hash) return hash dict; int pro() { int id=cnt++; Node& u=node[id]; u.left=u.right=-1; u.s=""; u.hash=0; while(isalpha(*p)) { u.hash=u.hash*27+*p-'a'+1; u.s.push_back(*p); p++; } if(*p=='(') {//(L,R) p++; u.left=pro(); p++; u.right=pro(); p++; } if(dict.count(u)!=0) { id--; cnt--; return dict[u]; } return dict[u]=id; } void print(int v) { if(done[v]==kase) printf("%d",v+1); else { done[v]=kase; printf("%s",node[v].s.c_str()); if(node[v].left!=-1) { putchar('('); print(node[v].left); putchar(','); print(node[v].right); putchar(')'); } } } int main() { #ifdef local freopen("pro.in","r",stdin); #endif scanf("%d",&T); for(kase=1;kase<=T;kase++) { dict.clear(); cnt=0; scanf("%s",input); p=input; print(pro()); putchar('\n'); } return 0; }