题意:给你n个字符串,每个字符串有一个值w,有q次询问,一共两种操作:一是“1 x y”表示把第x个串的w变为y;二是“2 x”,输出第x个串能放几次魔法。放魔法的条件是这样:用串x放魔法,如果在1~n个串中,一个串的w不超过x的w并且x是这个串的后缀,则算放了一次魔法。

思路:用Hash每个串,记录w,查询时遍历每个串的后缀是否和x相等并且wi <= wx。这里就是用到了字符串哈希的知识。

参考:

各种字符串Hash函数比较

字符串系列(一)——伟大的字符串Hash

代码:

#include<cstdio>
#include<set>
#include<map>
#include<cmath>
#include<stack>
#include<vector>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<iostream>
#include<algorithm>
#define ll long long
#define ull unsigned long long
using namespace std;
const int maxn = +;
const ull seed = ;
const int INF = 0x3f3f3f3f;
char s[maxn][maxn];
int w[maxn],len[maxn];
ull hash[maxn][maxn];
ull bin[maxn]; //seed的i次方自然溢出结果
void init(){
bin[] = ;
for(int i = ;i <= ;i++) //预处理
bin[i] = bin[i - ] * seed;
}
void HASH(int n){
for(int i = ;i <= n;i++){ //每个串hash
hash[i][] = ;
for(int j = ;j <= len[i];j++){
hash[i][j] = hash[i][j - ] * seed + s[i][j] - 'a';
}
}
}
inline ull getsuff(int i,int length){ //寻找子串hash值(此为后缀)
int l = len[i] - length + ,r = len[i];
return (hash[i][r] - hash[i][l - ] * bin[r - l + ]);
}
int solve(int x,int n){
int ans = ;
for(int i = ;i <= n;i++){
if(w[i] > w[x]) continue;
if(len[i] < len[x]) continue;
if(getsuff(i,len[x]) == hash[x][len[x]]){
ans++;
}
}
return ans;
}
int main(){
int T;
int n;
init();
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i = ;i <= n;i++){
scanf("%s%d",s[i] + ,&w[i]);
len[i] = strlen(s[i] + );
}
HASH(n);
int q;
int o,x,y;
scanf("%d",&q);
while(q--){
scanf("%d",&o);
if(o == ){
scanf("%d%d",&x,&y);
w[x] = y;
}
else{
scanf("%d",&x);
printf("%d\n",solve(x,n));
}
}
}
return ;
}

FZU 2280 Magic(字符串Hash)题解的更多相关文章

  1. I - Magic FZU - 2280 (字符串hash)

    题目链接: I - Magic FZU - 2280 学习链接: FZU - 2280 I - Magic 题目大意: 给你nn个字符串,每个字符串有一个值ww,有qq次询问,一共两种操作:一是“1, ...

  2. Magic FZU - 2280 无脑HASH暴力

    Kim is a magician, he can use n kinds of magic, number from 1 to n. We use string Si to describe mag ...

  3. 【题解】 Codeforces Edu44 F.Isomorphic Strings (字符串Hash)

    题面戳我 Solution 我们按照每个字母出现的位置进行\(hash\),比如我们记录\(a\)的位置:我们就可以把位置表示为\(0101000111\)这种形式,然后进行字符串\(hash\) 每 ...

  4. POJ 3865 - Database 字符串hash

    [题意] 给一个字符串组成的矩阵,规模为n*m(n<=10000,m<=10),如果某两列中存在两行完全相同,则输出NO和两行行号和两列列号,否则输出YES [题解] 因为m很小,所以对每 ...

  5. 字符串Hash || BZOJ 3555: [Ctsc2014]企鹅QQ || P4503 [CTSC2014]企鹅QQ

    题面:[CTSC2014]企鹅QQ 题解:无 代码: #include<iostream> #include<cstring> #include<cstdio> # ...

  6. CodeForces 1056E - Check Transcription - [字符串hash]

    题目链接:https://codeforces.com/problemset/problem/1056/E One of Arkady's friends works at a huge radio ...

  7. 【bzoj3555】[Ctsc2014]企鹅QQ 字符串hash

    题目描述 PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志.群.即时通讯.相册.集市等丰富强大的互联网功能体 ...

  8. 【bzoj3916】[Baltic2014]friends 字符串hash

    题目描述 有三个好朋友喜欢在一起玩游戏,A君写下一个字符串S,B君将其复制一遍得到T,C君在T的任意位置(包括首尾)插入一个字符得到U.现在你得到了U,请你找出S. 输入 第一行一个数N,表示U的长度 ...

  9. [CQOI2014][bzoj3507] 通配符匹配 [字符串hash+dp]

    题面 传送门 思路 0x01 KMP 一个非常显然而优秀的想法:把模板串按照'*'分段,然后对于每一段求$next$,'?'就当成可以对于任意字符匹配就行了 对于每个文本串,从前往后找第一个可以匹配的 ...

随机推荐

  1. Linux命令行常用光标移动快捷键

    Linux 命令行快捷键 涉及在Linux命令行下进行快速移动光标.命令编辑.编辑后执行历史命令.Bang(!)命令.控制命令等.让basher更有效率. 常用 ctrl+左右键:在单词之间跳转 ct ...

  2. linux 学习的一些书单,对了解android 也有大用

    要推荐的书,我在<那两年炼就的Android内功修养>这篇文章中有提到,这里再列一下出来: 语言类: <深度探索C++对象模型>,对应的英文版是<Inside C+++  ...

  3. 【Android N 7.1.1】 锁屏之上显示Toast

    package com.android.systemuirom.keyguard; import android.content.Context; import android.view.Gravit ...

  4. myBatis调用postgreSQL存储过程

    1.调用没有OUT参数的存储过程: 创建存储过程: create or replace function get_code(a1 varchar(32)) returns varchar(32) as ...

  5. Egret置于后台时,暂停游戏逻辑 (Egret 5 )

    官网教程-生命周期:http://developer.egret.com/cn/2d/lifecycle 主要是在游戏置于后台时,关闭游戏逻辑.渲染逻辑和背景音乐,保证更好的用户体验. 一 Egret ...

  6. 【BZOJ2588】Spoj 10628. Count on a tree 主席树+LCA

    [BZOJ2588]Spoj 10628. Count on a tree Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lasta ...

  7. oracle的分页查询,mabatis的sql配置

    <select id="getCardcaseByPage" resultType="Cardcase" > select * from ( sel ...

  8. java后端技术栈

  9. 模拟退火算法(西安网选赛hdu5017)

    Ellipsoid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  10. 免费访问:谷歌搜索,Gmail邮箱,Chrome商店

    分享个免费的google的服务的方法 1,插件下载: http://note.youdao.com/noteshare?id=6a3e52f8d4ccf63c751eeddd625a118d 2,使用 ...