hdu 1880 魔咒词典(字符串hash)


题目链接:hdu 1880 魔咒词典

题意:

给你一个10w的词典,让你输出对应的字段。

题解:

map暴力存字符串肯定会卡内存,这里用BKDR字符串hash一下,用map映射一下。

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;++i)
 3 using namespace std;
 4 typedef unsigned long long ull;
 5 
 6 const int N=1e5+7,seed=1331;
 7 char tmp[200],str[200],mo[N][25],gong[N][90];
 8 int ed,n;
 9 map<ull,int>cnt1;
10 map<ull,int>cnt2;
11 
12 inline int idx(char x)
13 {
14     if(x==' ')return 1;
15     return x-'a'+2;
16 }
17 
18 ull ask(char *s)
19 {
20     ull now=0;
21     for(int i=0;s[i]!=0;i++)
22     {
23         now+=now*seed+idx(s[i]);
24     }
25     return now;
26 }
27 
28 void ins()
29 {
30     int now=0;
31     for(int i=1;tmp[i]!=0;i++)
32     {
33         if(tmp[i]==']')
34         {
35             str[now]=0;
36             cnt1[ask(str)]=++ed;
37             strcpy(mo[ed],str);
38             now=0;
39             i+=2;
40         }
41         str[now++]=tmp[i];
42     }
43     str[now]=0;
44     cnt2[ask(str)]=ed;
45     strcpy(gong[ed],str);
46 }
47 
48 int main()
49 {
50     while(gets(tmp))
51     {
52         cnt1.clear(),cnt2.clear();
53         ed=0;
54         ins();
55         while(1)
56         {
57             gets(tmp);
58             if(tmp[0]=='@')break;
59             ins();
60         }
61         scanf("%d",&n);
62         getchar();
63         F(i,1,n)
64         {
65             gets(tmp);
66             if(tmp[0]=='[')
67             {
68                 int now=0;
69                 for(int j=1;tmp[j]!=']';j++)str[now++]=tmp[j];
70                 str[now]=0;
71                 ull tp=ask(str);
72                 int cur=cnt1[tp];
73                 if(cur)printf("%s\n",gong[cur]);
74                 else puts("what?");
75             }else
76             {
77                 ull tp=ask(tmp);
78                 int cur=cnt2[tp];
79                 if(cur)printf("%s\n",mo[cur]);
80                 else puts("what?");
81             }
82         }
83     }
84     return 0;
85 }
View Code

优质内容筛选与推荐>>
1、Mysql索引与优化 之索引类型
2、「HAOI2007」理想的正方形
3、ajax实现分页和分页查询
4、实验报告一 词法分析程序
5、返回一个二维数组最大子数组的和


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn