思路:哈希之后一直爬就是了
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
const int N=10010;
int T,q,n,bp[N],ep[N],ch[N],bro[N];
char s[N*20*2],w[N][25],ss[N*20*2];
int dfs(int x,int &pos)
{
//puts(s+x);
int i=x,tt=n,t;
while(s[i]!='}')
{
int j=0;
while(s[i]!=':') w[n][j++]=s[i++];
w[n][j]=0;
//puts(w[n]);
bro[n]=ch[n]=0;
i++;// :
t=n++;
bp[t]=i;
if(s[i]=='{') { ch[t]=dfs(i+1,ep[t]);i=++ep[t]; }
else
{
while(s[i]!='}'&&s[i]!=',') i++;
ep[t]=i;
}
bro[t]=n;
if(s[i]==',') i++;
//puts(s+i);
}
bro[t]=0;
pos=i;
if(tt==n) return 0;
return tt;
}
/*
const int HASH=10007;
char e[N][25];
struct Hash
{
int *head,*bro,n;
Hash()
{
head=new int[HASH];
bro=new int[N];
n=1;
}
int hash(char*s)
{
int ans=1;
for(int i=0;s[i];i++) ans*=s[i];
if(ans<0) ans=-ans;
return ans%HASH;
}
bool cmp(char*a,char*b) { return !strcmp(e[a],e[b]); }
bool insert(int s)
{
int h=hash(e[s]);
int u=head[h];
return 1;
}
};
*/
char st[25];
int find(char *ss,int u)
{
u=ch[u];//走到ch
int i=0;
//puts(ss);
while(ss[i]!='.'&&ss[i]!=0) { st[i]=ss[i];i++; }
st[i]=0;
//puts(st);
//printf("%d\n",i);
for(;u;u=bro[u]) if(!strcmp(w[u],st)) break;
if(!u) return 0;
if(!ss[i]) return u;
return find(ss+i+1,u);
}
void read(int u)
{
u=ch[u];
for(;u;u=bro[u]) printf("%s:%d %d %d %d\n",w[u],bro[u],ch[u],bp[u],ep[u]);
for(;u;u=bro[u]) if(ch[u]) read(u);
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
scanf("%d",&T);
while(T--)
{
scanf("%s%d",s,&q);
n=1;
ch[0]=dfs(1,ep[0]);
/* for(int u=1;u<n;u++)
{
char c=s[ep[u]];
s[ep[u]]=0;
puts(s+bp[u]);
s[ep[u]]=c;
printf("%s:%d %d %d %d\n",w[u],bro[u],ch[u],bp[u],ep[u]);
}
read(0);
*/ while(q--)
{
scanf("%s",ss);
int x=find(ss,0);
if(!x) puts("Error!");
if(!x) continue;
char c=s[ep[x]];
s[ep[x]]=0;
puts(s+bp[x]);
s[ep[x]]=c;
}
}
return 0;
}