delete pics to save space
This commit is contained in:
84
2.12219.cpp
Normal file
84
2.12219.cpp
Normal file
@ -0,0 +1,84 @@
|
||||
#include<cstdio>
|
||||
#include<string>
|
||||
#include<map>
|
||||
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<rhs.hash;
|
||||
if(left!=rhs.left) return left<rhs.left;
|
||||
return right<rhs.right;
|
||||
}
|
||||
} node[maxn];
|
||||
map<Node,int> 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;
|
||||
}
|
Reference in New Issue
Block a user