标签:
/*普通的hsah 由于元素太多 空间很小..hash碰撞很厉害.30分*/ #include<iostream> #include<cstdio> #include<cstring> #include<map> #define maxn 100010 #define mod 2000007 #define hs 117 using namespace std; int n,l,k,cnt,f[mod+10],l1[maxn],l2[maxn]; char s[110],c,s1[maxn][110],s2[maxn][110]; int main() { while(1) { gets(s);if(s[0]==‘@‘)break; cnt++;l=strlen(s); for(int i=0;i<l;i++) { if(s[i]==‘[‘)continue; if(s[i]==‘]‘){k=i+2;break;} s1[cnt][++l1[cnt]]=s[i]; } for(int i=k;i<l;i++)s2[cnt][++l2[cnt]]=s[i]; int a1=1,a2=7; for(int i=1;i<=l1[cnt];i++) a1=a1*s1[cnt][i]*mod+s1[cnt][i]*i; if(a1<0)a1=-a1;a1=a1%mod; for(int i=1;i<=l2[cnt];i++) a2=a2*s2[cnt][i]*mod+s2[cnt][i]*i; if(a2<0)a2=-a2;a2=a2%mod; f[a1]=cnt;f[a2]=cnt; } cin>>n;c=getchar(); for(int i=1;i<=n;i++) { gets(s);l=strlen(s);int li=0,falg=0; char si[110];memset(si,0,sizeof(si)); for(int i=0;i<l;i++) { if(s[i]==‘[‘){falg=1;continue;} if(s[i]==‘]‘)break; si[++li]=s[i]; } int ai;if(falg)ai=1;else ai=7; for(int i=1;i<=li;i++) ai=ai*si[i]*mod+si[i]*i; if(ai<0)ai=-ai;ai=ai%mod; if(f[ai]==0)printf("what?\n"); else { if(falg) { for(int i=1;i<=l2[f[ai]];i++) printf("%c",s2[f[ai]][i]); printf("\n"); } else { for(int i=1;i<=l1[f[ai]];i++) printf("%c",s1[f[ai]][i]); printf("\n"); } } } return 0; }
/*map 爆空间.*/ #include<iostream> #include<cstdio> #include<cstring> #include<map> using namespace std; map<string,string>f; int n,l,k; char s[110],c; int main() { while(1) { gets(s); if(s[0]==‘@‘)break; string s1,s2;l=strlen(s); for(int i=0;i<l;i++) { if(s[i]==‘[‘)continue; if(s[i]==‘]‘){k=i+2;break;} s1+=s[i]; } for(int i=k;i<l;i++)s2+=s[i]; f[s1]=s2;f[s2]=s1; } cin>>n;c=getchar(); for(int i=1;i<=n;i++) { gets(s); string s1,s2;l=strlen(s); for(int i=0;i<l;i++) { if(s[i]==‘[‘)continue; if(s[i]==‘]‘)break; s1+=s[i]; } if(f[s1]=="")cout<<"what?"<<endl; else cout<<f[s1]<<endl; } return 0; }
/*我同桌的暴力 居然过了....*/ #include<iostream> #include<cstdio> #include<cstring> #define maxn 100010 using namespace std; string ss,sss; char s[1010]; char s1[maxn][50],s2[maxn][100]; int n,tot,l1[maxn],l2[maxn]; int main() { int i,j,k; while(1) { gets(s); if(s[0]==‘@‘)break; tot++; int l=strlen(s); for(i=0;i<=l-1;i++) { s1[tot][l1[tot]++]=s[i]; if(s[i]==‘]‘)break; } for(j=i+2;j<=l-1;j++) s2[tot][l2[tot]++]=s[j]; } cin>>n; char c=getchar(); while(n--) { gets(s); int l=strlen(s); ss=s; if(ss[0]==‘[‘) { for(i=1;i<=tot;i++) { sss=s1[i]; if(ss==sss) { cout<<s2[i]<<endl; break; } } if(i==tot+1) cout<<"what?"<<endl; } else { for(i=1;i<=tot;i++) { sss=s2[i]; if(ss==sss) { for(j=1;j<l1[i]-1;j++) cout<<s1[i][j]; cout<<endl; break; } } if(i==tot+1) cout<<"what?"<<endl; } } return 0; }
/* 后来xzc说类似边表的搞一搞就好了 建一个图 hash值是点的编号 每个字符串是边 每个hash可能对应好几个字符串 都连到这个hash值上 然后查询的时候遍历这个点连出去的所有边 空间有点紧. */ #include<iostream> #include<cstdio> #include<cstring> #include<map> #define maxn 100010 #define mod 100007 #define hs 117 using namespace std; struct node { char s1[22],s2[82]; int pre; }A[maxn],B[maxn]; int n,l,k,ha,cnt,heada[mod],headb[mod]; char s[110],c,q1[110],q2[110],si[110]; int Hash(char *a) { int ret=1,l=strlen(a); for(int i=0;i<l;i++) ret=(ret*hs%mod+a[i])%mod; return ret%mod; } void Insert(char *a,char *b) { cnt++; strcpy(A[cnt].s1,a); strcpy(A[cnt].s2,b); ha=Hash(a); A[cnt].pre=heada[ha]; heada[ha]=cnt; strcpy(B[cnt].s1,a); strcpy(B[cnt].s2,b); ha=Hash(b); B[cnt].pre=headb[ha]; headb[ha]=cnt; } int find1(char *a) { ha=Hash(a); for(int i=heada[ha];i;i=A[i].pre) if(!strcmp(A[i].s1,a))return i; return 0; } int find2(char *a) { ha=Hash(a); for(int i=headb[ha];i;i=B[i].pre) if(!strcmp(B[i].s2,a))return i; return 0; } int main() { while(1) { memset(q1,0,sizeof(q1)); memset(q2,0,sizeof(q2)); gets(s);if(s[0]==‘@‘)break; l=strlen(s); int l1=-1,l2=-1; for(int i=0;i<l;i++) { if(s[i]==‘[‘)continue; if(s[i]==‘]‘){k=i+2;break;} q1[++l1]=s[i]; } for(int i=k;i<l;i++)q2[++l2]=s[i]; Insert(q1,q2); } cin>>n;c=getchar(); for(int i=1;i<=n;i++) { gets(s);l=strlen(s);int li=-1,falg=0; for(int i=0;i<l;i++) { if(s[i]==‘[‘){falg=1;continue;} if(s[i]==‘]‘)break; si[++li]=s[i]; } if(falg) { int r=find1(si); !r?cout<<"what?"<<endl:cout<<A[r].s2<<endl; } else { int r=find2(si); !r?cout<<"what?"<<endl:cout<<B[r].s1<<endl; } } return 0; }
标签:
原文地址:http://www.cnblogs.com/yanlifneg/p/5750948.html