hdu 1880 字符串hash
/*普通的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的更多相关文章
- HDU 1880 字符串hash 入门题
Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔 ...
- hdu 4821 字符串hash+map判重 String (长春市赛区I题)
http://acm.hdu.edu.cn/showproblem.php?pid=4821 昨晚卡了非常久,開始TLE,然后优化了之后,由于几个地方变量写混.一直狂WA.搞得我昨晚都失眠了,,. 这 ...
- HDU 4821 字符串hash
题目大意: 希望找到连续的长为m*l的子串,使得m个l长的子串每一个都不一样,问能找到多少个这样的子串 简单的字符串hash,提前预处理出每一个长度为l的字符串的hash值 #include < ...
- HDU 1880 简单Hash
题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=1880] 中文题面,题意很简单: 题解: 把每个 魔咒 和 对应的功能分别Hash,然后分别映射到ma ...
- Hdu 1800 字符串hash
题目链接 题意: 给出n(n<=3000)个字符串(长度<30,数字组成,肯能存在前导0), 问该序列最少可以分成多少个单调序列.可以转化成求相同字符串的个数的最大值 附上代码: /*** ...
- HDU 1880 魔咒词典 (字符串hash)
<题目链接> 题目大意: 就是每个字符串有一个配套的对应字符串,询问的时候,无论输出其中的哪一个字符串,输出另一个,如果不存在这个字符串,直接输出"what?". 解题 ...
- hdu 4622 Reincarnation 字符串hash 模板题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 题意:给定一个长度不超过2000的字符串,之后有不超过1e5次的区间查询,输出每次查询区间中不同 ...
- HDU 5763 Another Meaning dp+字符串hash || DP+KMP
题意:给定一个句子str,和一个单词sub,这个单词sub可以翻译成两种不同的意思,问这个句子一共能翻译成多少种不能的意思 例如:str:hehehe sub:hehe 那么,有**he.he** ...
- HDU 1880 题解(字符串哈希)
题面: 魔咒词典 Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
随机推荐
- Android学习----AndroidManifest.xml文件解析
一个Android应用程序的结构: 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了pack ...
- 正则表达式 U贪婪模式
<?php/*模式修正符号: i u 位置:"//模式修正符位置" 可以一次使用一个,也可以一次使用多个 对整个正则表达式调优用的,也可以说是对正则表达式功能的扩展 &quo ...
- JavaScript设计模式之代理模式
一.代理模式概念 代理,顾名思义就是帮助别人做事,GoF对代理模式的定义如下: 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问.代理模式使得代理对象控制具体对象的引用.代理几乎可 ...
- 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 ...
- SqlServer将数据库中的表复制到另一个数据库
前述: 文章来自百度经验 操作: 在使用SqlServer的过程中,我们可能需要将表从一个数据库复制到另一个数据库中,今天,为大家介绍这种操作的具体方法及步骤. 复制表结构 1 首先,打开并连接Sql ...
- windows环境下VS2013编译openSSL
openssl版本:1.0.2h 编译器:MSVC (VS2013) 需要准备工具:perl. windows环境的perl下载请戳这里:http://www.activestate.com/acti ...
- Spring boot将配置属性注入到bean类中
一.@ConfigurationProperties注解的使用 看配置文件,我的是yaml格式的配置: // file application.yml my: servers: - dev.bar.c ...
- 【HDOJ】4985 Little Pony and Permutation
水题. #include <cstdio> #define MAXN 100005 int buf[MAXN], n; int main() { int i, j, k; while (s ...
- 【HDOJ】4982 Goffi and Squary Partition
题意就是整数划分,选出和为n的K个整数,其中K-1个数的和为完全平方数S.选择整数时需要从1,2,3..连续选择,当选择整数与n-S相等时,需要跳过n-S,即选择n-S+1.如此选择K-2个数,从而可 ...
- COJ 0343 WZJ的公司(二)
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=313 试题描述: WZJ的公司放假了!为了保证假期期间公司的安全,WZJ决定 ...