/*普通的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+],l1[maxn],l2[maxn];
char s[],c,s1[maxn][],s2[maxn][];
int main()
{
while()
{
gets(s);if(s[]=='@')break;
cnt++;l=strlen(s);
for(int i=;i<l;i++)
{
if(s[i]=='[')continue;
if(s[i]==']'){k=i+;break;}
s1[cnt][++l1[cnt]]=s[i];
}
for(int i=k;i<l;i++)s2[cnt][++l2[cnt]]=s[i];
int a1=,a2=;
for(int i=;i<=l1[cnt];i++)
a1=a1*s1[cnt][i]*mod+s1[cnt][i]*i;
if(a1<)a1=-a1;a1=a1%mod;
for(int i=;i<=l2[cnt];i++)
a2=a2*s2[cnt][i]*mod+s2[cnt][i]*i;
if(a2<)a2=-a2;a2=a2%mod;
f[a1]=cnt;f[a2]=cnt;
}
cin>>n;c=getchar();
for(int i=;i<=n;i++)
{
gets(s);l=strlen(s);int li=,falg=;
char si[];memset(si,,sizeof(si));
for(int i=;i<l;i++)
{
if(s[i]=='['){falg=;continue;}
if(s[i]==']')break;
si[++li]=s[i];
}
int ai;if(falg)ai=;else ai=;
for(int i=;i<=li;i++)
ai=ai*si[i]*mod+si[i]*i;
if(ai<)ai=-ai;ai=ai%mod;
if(f[ai]==)printf("what?\n");
else
{
if(falg)
{
for(int i=;i<=l2[f[ai]];i++)
printf("%c",s2[f[ai]][i]);
printf("\n");
}
else
{
for(int i=;i<=l1[f[ai]];i++)
printf("%c",s1[f[ai]][i]);
printf("\n");
}
}
}
return ;
}
/*map 爆空间.*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
map<string,string>f;
int n,l,k;
char s[],c;
int main()
{
while()
{
gets(s);
if(s[]=='@')break;
string s1,s2;l=strlen(s);
for(int i=;i<l;i++)
{
if(s[i]=='[')continue;
if(s[i]==']'){k=i+;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=;i<=n;i++)
{
gets(s);
string s1,s2;l=strlen(s);
for(int i=;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 ;
}

 
/*我同桌的暴力 居然过了....*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100010
using namespace std;
string ss,sss;
char s[];
char s1[maxn][],s2[maxn][];
int n,tot,l1[maxn],l2[maxn];
int main()
{
int i,j,k;
while()
{
gets(s);
if(s[]=='@')break;
tot++;
int l=strlen(s);
for(i=;i<=l-;i++)
{
s1[tot][l1[tot]++]=s[i];
if(s[i]==']')break;
}
for(j=i+;j<=l-;j++)
s2[tot][l2[tot]++]=s[j];
}
cin>>n;
char c=getchar();
while(n--)
{
gets(s);
int l=strlen(s);
ss=s;
if(ss[]=='[')
{
for(i=;i<=tot;i++)
{
sss=s1[i];
if(ss==sss)
{
cout<<s2[i]<<endl;
break;
}
}
if(i==tot+)
cout<<"what?"<<endl;
}
else
{
for(i=;i<=tot;i++)
{
sss=s2[i];
if(ss==sss)
{
for(j=;j<l1[i]-;j++)
cout<<s1[i][j];
cout<<endl;
break;
}
}
if(i==tot+)
cout<<"what?"<<endl;
}
}
return ;
}
/*
后来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[],s2[];
int pre;
}A[maxn],B[maxn];
int n,l,k,ha,cnt,heada[mod],headb[mod];
char s[],c,q1[],q2[],si[];
int Hash(char *a)
{
int ret=,l=strlen(a);
for(int i=;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 ;
}
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 ;
}
int main()
{
while()
{
memset(q1,,sizeof(q1));
memset(q2,,sizeof(q2));
gets(s);if(s[]=='@')break;
l=strlen(s);
int l1=-,l2=-;
for(int i=;i<l;i++)
{
if(s[i]=='[')continue;
if(s[i]==']'){k=i+;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=;i<=n;i++)
{
gets(s);l=strlen(s);int li=-,falg=;
for(int i=;i<l;i++)
{
if(s[i]=='['){falg=;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 ;
}

hdu 1880 字符串hash的更多相关文章

  1. HDU 1880 字符串hash 入门题

    Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔 ...

  2. hdu 4821 字符串hash+map判重 String (长春市赛区I题)

    http://acm.hdu.edu.cn/showproblem.php?pid=4821 昨晚卡了非常久,開始TLE,然后优化了之后,由于几个地方变量写混.一直狂WA.搞得我昨晚都失眠了,,. 这 ...

  3. HDU 4821 字符串hash

    题目大意: 希望找到连续的长为m*l的子串,使得m个l长的子串每一个都不一样,问能找到多少个这样的子串 简单的字符串hash,提前预处理出每一个长度为l的字符串的hash值 #include < ...

  4. HDU 1880 简单Hash

    题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=1880] 中文题面,题意很简单: 题解: 把每个 魔咒 和 对应的功能分别Hash,然后分别映射到ma ...

  5. Hdu 1800 字符串hash

    题目链接 题意: 给出n(n<=3000)个字符串(长度<30,数字组成,肯能存在前导0), 问该序列最少可以分成多少个单调序列.可以转化成求相同字符串的个数的最大值 附上代码: /*** ...

  6. HDU 1880 魔咒词典 (字符串hash)

    <题目链接> 题目大意: 就是每个字符串有一个配套的对应字符串,询问的时候,无论输出其中的哪一个字符串,输出另一个,如果不存在这个字符串,直接输出"what?". 解题 ...

  7. hdu 4622 Reincarnation 字符串hash 模板题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 题意:给定一个长度不超过2000的字符串,之后有不超过1e5次的区间查询,输出每次查询区间中不同 ...

  8. HDU 5763 Another Meaning dp+字符串hash || DP+KMP

    题意:给定一个句子str,和一个单词sub,这个单词sub可以翻译成两种不同的意思,问这个句子一共能翻译成多少种不能的意思 例如:str:hehehe   sub:hehe 那么,有**he.he** ...

  9. HDU 1880 题解(字符串哈希)

    题面: 魔咒词典 Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

随机推荐

  1. Android学习----AndroidManifest.xml文件解析

    一个Android应用程序的结构: 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了pack ...

  2. 正则表达式 U贪婪模式

    <?php/*模式修正符号: i u 位置:"//模式修正符位置" 可以一次使用一个,也可以一次使用多个 对整个正则表达式调优用的,也可以说是对正则表达式功能的扩展 &quo ...

  3. JavaScript设计模式之代理模式

    一.代理模式概念 代理,顾名思义就是帮助别人做事,GoF对代理模式的定义如下: 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问.代理模式使得代理对象控制具体对象的引用.代理几乎可 ...

  4. Websocket 与代理服务器如何交互? How HTML5 Web Sockets Interact With Proxy Servers

    How HTML5 Web Sockets Interact With Proxy Servers Posted by Peter Lubberson Mar 16, 2010 With the re ...

  5. SqlServer将数据库中的表复制到另一个数据库

    前述: 文章来自百度经验 操作: 在使用SqlServer的过程中,我们可能需要将表从一个数据库复制到另一个数据库中,今天,为大家介绍这种操作的具体方法及步骤. 复制表结构 1 首先,打开并连接Sql ...

  6. windows环境下VS2013编译openSSL

    openssl版本:1.0.2h 编译器:MSVC (VS2013) 需要准备工具:perl. windows环境的perl下载请戳这里:http://www.activestate.com/acti ...

  7. Spring boot将配置属性注入到bean类中

    一.@ConfigurationProperties注解的使用 看配置文件,我的是yaml格式的配置: // file application.yml my: servers: - dev.bar.c ...

  8. 【HDOJ】4985 Little Pony and Permutation

    水题. #include <cstdio> #define MAXN 100005 int buf[MAXN], n; int main() { int i, j, k; while (s ...

  9. 【HDOJ】4982 Goffi and Squary Partition

    题意就是整数划分,选出和为n的K个整数,其中K-1个数的和为完全平方数S.选择整数时需要从1,2,3..连续选择,当选择整数与n-S相等时,需要跳过n-S,即选择n-S+1.如此选择K-2个数,从而可 ...

  10. COJ 0343 WZJ的公司(二)

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=313 试题描述: WZJ的公司放假了!为了保证假期期间公司的安全,WZJ决定 ...