妮可妮可妮 [Hash]
妮可妮可妮
题目描述
小P特别喜欢动画Love Live中的角色妮可,每当他听到妮可说“niconiconi”时,他总会感到特别兴奋,还会露出绅士般的微笑。
作为一名理论计算机科学家,小P开始研究“niconiconi”这种串的特点。他发现,“niconiconi”可以拆成“ni”、“co”、“ni”、“co”、“ni”这五部分。
对这个模型进行了抽象后,小P发现,任何形如ABABA的串都有类似的特点,其中A、B为非空串,我们称这样的串满足性质P。比如“aaaaa”就满足性质P,而“ababab”却不满足性质P。
有了这个革命性的发现,结合他最近新学的数据结构“后缀树”,小P决定造一道题。这道题是这样的,小P给你一个仅由小写英文字母组成的串S,你拿到这个串之后,小P会问你q个问题,每个问题形如“S的后缀p是不是满足性质P的串呀”。
注:设S的长度为n,那么S[1..n]的后缀p就是子串S[p..n]。
输入
第一行一个仅由小写英文字母组成的串S。
第二行一个整数q。
接下来q行,每行一个数p_i,表示第i次的问题是:“S的后缀p_i是不是满足性质P的串呀”。
输出
输出文件一共q行,第i行为对第i个问题的回答。
如果满足性质P,回答:“niconiconi”。(不包含引号)
如果不满足性质P,回答:“no”。(不包含引号)
样例输入
niconiconi
1
1
样例输出
niconiconi
提示
样例输入2
orzorzorz
3
1
7
2
样例输出2
no
no
niconiconi
测试点1..3:\(|S|≤100\)
测试点1..6:\(|S|≤1000\)
测试点1..10:\(1≤|S|≤5*10^5,1≤q≤10^5\)
题解
我么发现一个字符串若满足性质P,则必然可以分成[A][BA][BA]这三部分
而后面BA可以看成一个部分,也就是求一个字串,满足ACC,其中A是C的后缀
所以对于\(60\)%的数据,我们可以\(O(n^2)\)枚举C的长度,再判断A的长度最长可以是多长,设ans[i]表示后缀i是否满足性质P,那么我们每次枚举一个C,都可以得到一段区间内ans[]都等于1
那么怎么优化呢?我们可以发现枚举C之后,A的长度是具有单调性的,因此我们可以二分一个A的长度,这样时间复杂度就优化到了\(O(n*logn)\)
利用差分的思想统计哪些区间的前缀满足性质P
这些都是预处理,最后查询的时候就是\(O(1)\)查询
Code
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long lol;
const int N=5*1e5+10,base=31;
lol Hash[N],sum[N],tq,aq[N];
int m,x,ans[N];
char s[N];
inline lol get(int l,int r)
{
return Hash[r]-Hash[l-1]*sum[r-l+1];
}
int main()
{
//freopen("nico.in","r",stdin);
//freopen("nico.out","w",stdout);
scanf("%s%d",s+1,&m);
int n=strlen(s+1); sum[0]=1;
for(int i=1;i<=n;i++) Hash[i]=(Hash[i-1]*base+s[i]-'a'+1),sum[i]=sum[i-1]*base;
for(int i=1;i<=n;i++) {
if(get(n-i+1,n)!=get(n-2*i+1,n-i)) continue;
lol mid,l=1,r=i-1;
while(l<r) {
mid=l+r+1>>1;
if(get(n-mid+1,n)!=get(n-2*i-mid+1,n-2*i)) r=mid-1;
else l=mid;
}
++aq[n-2*i-l+1],--aq[n-2*i+1];
}
for(int i=1;i<=n;i++)
tq+=aq[i],ans[i]=(tq>0);
for(int i=1;i<=m;i++) {
scanf("%d",&x);
puts(ans[x]?"niconiconi":"no");
}
}
博主蒟蒻,随意转载.但必须附上原文链接
http://www.cnblogs.com/real-l/
妮可妮可妮 [Hash]的更多相关文章
- 复杂的 Hash 函数组合有意义吗?
很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...
- 对抗密码破解 —— Web 前端慢 Hash
(更新:https://www.cnblogs.com/index-html/p/frontend_kdf.html ) 0x00 前言 天下武功,唯快不破.但在密码学中则不同.算法越快,越容易破. ...
- 散列表(hash table)——算法导论(13)
1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...
- hash表长度优化证明
hash表冲突的解决方法一般有两个方向: 一个是倾向于空间换时间,使用向量加链表可以最大程度的在节省空间的前提下解决冲突. 另外一个倾向于时间换空间,下面是关于这种思路的一种合适表长度的证明过程: 这 ...
- SQL Server-聚焦查询计划Stream Aggregate VS Hash Match Aggregate(二十)
前言 之前系列中在查询计划中一直出现Stream Aggregate,当时也只是做了基本了解,对于查询计划中出现的操作,我们都需要去详细研究下,只有这样才能对查询计划执行的每一步操作都了如指掌,所以才 ...
- C# salt+hash 加密
一.先明确几个基本概念 1.伪随机数:pseudo-random number generators ,简称为:PRNGs,是计算机利用一定的算法来产生的.伪随机数并不是假随机 数,这里的" ...
- SQL 提示介绍 hash/merge/concat union
查询提示一直是个很有争议的东西,因为他影响了sql server 自己选择执行计划.很多人在问是否应该使用查询提示的时候一般会被告知慎用或不要使用...但是个人认为善用提示在不修改语句的条件下,是常用 ...
- 对一致性Hash算法,Java代码实现的深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
- 巧用location.hash保存页面状态
在我们的项目中,有大量ajax查询表单+结果列表的页面,由于查询结果是ajax返回的,当用户点击列表的某一项进入详情页之后,再点击浏览器回退按钮返回ajax查询页面,这时大家都知道查询页面的表单和结果 ...
随机推荐
- 线程基础四 使用Monitor类锁定资源
前面我们讲过了lock的用法以及竞争条件导致的错误,实际上lock关键字是Monitor类用例的一个语法糖.如果我们分解使用了lock关键字的代码,将会看到它如下面代码片段所示: bool acqui ...
- HDU暑假多校第三场H.Monster Hunter
一.题意 给定一个树状地图,每个树节点上有一只怪物,打死一只怪物的过程中将会消耗A点HP,打死之后将会获得B点HP.因为树状结构,所以每只怪物必须先打死父节点的怪兽之后在打死子节点的怪物.现在,给定每 ...
- 3106: [cqoi2013]棋盘游戏
3106: [cqoi2013]棋盘游戏 链接 分析: 极大极小搜索 + 记忆化. 代码 #include<bits/stdc++.h> using namespace std; type ...
- 签名的html
<b><a href="http://www.feiyuanxing.com" style="color:red">未来星开发团队--狒 ...
- 「日常训练」Alena And The Heater (CFR466D2D)
题意(Codeforces 940D) 根据给定要求构建数列,求能构建出相同数列的l和r. 分析 这题写的是真的烦.一定要想到对b串要按照5个5个的看!为什么5个5个的看?因为根据题意,是先看前4个再 ...
- 树莓派i2c功能
默认i2c是关闭的,用raspi-config 命令,会弹出一个配置框图 选择enable i2c就可以了 reboot之后 没有在/dev/目录下发现i2c-x的设备,这个时候需要做以下操作 1.添 ...
- Python-学习-小例子练习
网上了点小例子,练习一下下,都是特别简单的.而且这些代码也都是找的网上的代码,目的是在于练习一下Python和熟悉下Python的编码风格等等 学习一门语言,最快的方法就是把它用在世界的开发中,这样才 ...
- 虚拟现实-VR-UE4-获取UE4
UE4现在虽然是开源,但是并不是免费的,在你的游戏成功后,回收取5%费用和每个月19美元的费用 所以,第一步,进去UE4官网:https://www.unrealengine.com/zh-CN/wh ...
- ubuntu12.04停留在grub界面问题
修改ubuntu 12.04 停留在grub界面的步骤: 1. 在/etc/default/grub配置文件中, 添加一项GRUB_RECORDFAIL_TIMEOUT: GRUB_TIMEOUT=2 ...
- redis字符串基本操作
redis之字符串类型: 字符串类型是redis中最基本的数据类型,同时它也是memcached中仅有的数据类型.redis字符串类型的键能存储任何形式的字符串,包括二进制数据,例如,存储json化的 ...