清北学堂 清北-Day1-R2-监听monitor
题目描述
【背景】
不阅读本题的【背景】并不影响通过本题。
三体信息中没有包含对三体⼈⽣物形态的任何描述,⼈类要在四百多年以后才能真正看到三体⼈。在阅读信息时,叶⽂洁只能把三体⼈想象成⼈类的形象。
1379 号监听站已经存在了上千年,像这样的监听站,在三体世界中有⼏千个,它们全神贯注地聆听着宇宙间可能存在的智慧⽂明的信息。最初监听站中有上百名监听员,但随着技术的进步,现在只有⼀个⼈值守了。监听员是⼀个卑微的职业,他们虽然⾝处恒温且能保证⽣活供给的监听室中,在乱世纪不必脱⽔,但他们的⽣命也就在这⼩⼩的空间中流逝,能够享受到的恒纪元快乐⽐其他⼈要少得多。1379 号监听员投过⼩⼩的床⼦看着外⾯的三体世界,这是乱纪元的⿊夜,巨⽉还没有升起来,⼤多数⼈都处于脱⽔的冬眠中,甚⾄植物也本能地脱⽔了,成了附着于地表没有⽣命的⼀束⼲纤维。星光下,⼤地看上去像⼀⼤块冰冷的⾦属。
这是最孤寂的时刻,在静静的午夜,宇宙向它的聆听者展⽰着⼴漠的荒凉。 1379 号监听员最不愿意看的,就是显⽰器上缓缓移动的那条曲线,那是监听系统接收到的宇宙电波的波形,⽆意义的噪声。他感到这条⽆限长的线就是宇宙的抽象,⼀头连着⽆限的过去,另⼀头连着⽆限的未来,中间只有为⽆规律⽆⽣命的随机起伏。⼀个个⾼低错落的波峰就像⼀粒粒⼤⼩不等的沙⼦,整条线就像是所有沙粒排成⾏形成的⼀维沙漠,荒凉寂寥,长得令⼈⽆法忍受。你可以沿着它向前向后⾛⽆限远,但永远找不到归宿。
【问题描述】
监听的宇宙电波可以抽象成⼀个长度为 L 的⼩写字母组成的字符串。
同时在三体⼈总结出来了 n 段敏感电波的样⼦,每段敏感电波的长度都是 m。
现在请你实现⼀个程序,求出在这长度为 L 的⼩写字母组成的字符串中某个敏感电波第⼀次出现的位置(位置从 1 开始计数)。
如果从头到尾,没有任何敏感电波出现,输出”no”(不带双引号)。
输入
第⼀⾏三个整数 L, n, m。
接下来 n ⾏,每⾏⼀个长度为 m 的字符串,表⽰敏感电波。
接下来⼀⾏,⼀个长度为 L 的字符串,表⽰监听到的电波。
输出
输出⼀个整数或者⼀个字符串”no”(不带双引号)。
样例输入
11 3 3
aba
cba
abc
aaabbabcaba
样例输出
6
【样例输入 2】
11 3 3
aba
cba
abc
aaabbabzabz
【样例输出 2】
no
对于前 30% 的数据, 1 ≤ L ≤ 100, 1 ≤ n ≤ 100, 1 ≤ m ≤ 20。
对于前 50% 的数据, 1 ≤ L ≤ 10000, 1 ≤ n ≤ 1000, 1 ≤ m ≤ 20。
对于另外 20% 的数据, n = 1。
对于前 100% 的数据, 1 ≤ L ≤ 10^5, 1 ≤ n ≤ 10^4, 1 ≤ m ≤ 20。
本来以为要用KMP,但是我不会!
后来又想到了AC自动机这个吓人的东西,但是——我不会
于是考虑到NOIP阶段常用的字符串匹配方法,其实还是hash比较多,但是hash的缺点是只适用于子串长度相同的情况,否则又要变成 $ \Theta ( n ^ 2 ) $ 了
于是这道题就直接把所有待匹配的串散列出来,然后在主串中枚举长度相等的部分,同取hash值并用二分查找验证存在性就好了(当然,要先把散列表排序)
AC代码:
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#define ull unsigned long long
const int N = 1e5 + 5;
const int base=233;
int L,n,m;
char s[N],ss[N];
ull h[N];
inline bool check(int l,int r,ull val){
#define mid ((l+r)>>1)
while(l<=r){
if(h[mid]==val) return true;
if(h[mid]>val) r=mid-1;
if(h[mid]<val) l=mid+1;
}
#undef mid
return false;
}
int main(){
scanf("%d%d%d",&L,&n,&m);
for(int i=1;i<=n;++i){
scanf("%s",ss);
for(int j=0;j<m;++j) h[i]=h[i]*base+ss[j];
}
scanf("%s",s+1);std::sort(h+1,h+n+1);
for(int i=1;i<=L;++i){
register ull tmp=0;
for(int j=i;j<m+i;++j) tmp=tmp*base+s[j];
if(check(1,n,tmp)){printf("%d\n",i);return 0;}
}
puts("no");
return 0;
}
最新文章
- Mac OS sierra app is damaged
- IOS系列swift语言之课时七
- IIS7 Application Pool Integrate Mode 和 Classic Mode 的区别
- Todd&#39;s Matlab讲义第6讲:割线法
- CentOS 设置网络(修改IP&;修改网关&;修改DNS)--update.14.08.15
- [Android Pro] 关于Android的HTTP客户端的小秘密
- .net控件事件中的Sender
- python(4) - 装饰器
- svn出错问题(用户名密码有修改以及资源url改变时)
- delphi 通过控件的handle取得控件
- C、C++中“*”操作符和“后++”操作符的优先级
- gdb图形化调试工具总结
- Oracle Dataguard 介绍
- JavaScript实例技巧精选(9)—计算器实例1
- CJOJ 1071 【Uva】硬币问题(动态规划)
- Java之集合的遍历与迭代器
- Linux网络简介
- 微信小程序开发06-一个业务页面的完成
- 【python】面向对象编程之@property、@setter、@getter、@deleter用法
- spring Jackson 配置笔记
热门文章
- 四十二、Linux 线程——线程同步之条件变量之线程状态转换
- GCC编译器原理(一)03------GCC 工具:gprof、ld、libbfd、libiberty 和libopcodes
- 大规模数据导入和导出(mysql)
- MVC异步AJAX的三种方法(JQuery的Get方法、JQuery的Post方法和微软自带的异步方法)
- 常用SQL语句大全总结
- Java -cp 命令行引用多个jar包的简单写法(Windows、Linux
- linux 进程间同步互斥
- Django学习手册 - ORM 多对多表
- 错误整理:No plugin found for prefix &#39;jetty&#39; in the current project and in the plugin groups
- Spotlight LGWR1 一直告警