清北学堂学习总结 day2 字符串 练习
1.hash表(哈希表)
codevs 2147 数星星--简单哈希
小明是一名天文爱好者,他喜欢晚上看星星。这天,他从淘宝上买下来了一个高级望远镜。他十分开心,于是他晚上去操场上看星星。
不同的星星发出不同的光,他的望远镜可以计算出观测到的星星发出的光的数值W。小明当然想尽可能地多看到星星,于是他每看到一颗星星,就要看看他之前有没有看过这颗星星。但是他看的星星太多了,他根本数不过来,于是他让你帮忙。
共有两行,第一行只有一个整数,为小明观测到的星星的数量n。第二行有n个整数,每两个整数由一个空格隔开,分别为小明观测到每颗星星的光的数值W[1]-W[n]。
只有一行,这一行共有n个数字0或1。0表示对应的星星之前没有观测到,1表示对应的星星之前已经看过了。注意:数字之间没有空格!
5
1 5 5 4 1
- 00101
样例是往往是骗人的,本题中
30%的数据,0<n≤5000。
20%的数据,-20000≤W≤20000。
60%的数据,0<n≤50000。
100%的数据,0<n≤500000;-2000000000≤W≤2000000000。
分类标签 Tags 点此展开
- #include<iostream>
- using namespace std;
- #define mod 500009/*取>500000的最小质数即可*/
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<cmath>
- long long hash_table[mod*];
- int n,w[mod];
- int main()
- {
- memset(hash_table,-,sizeof(hash_table));
- scanf("%d",&n);
- for(int i=;i<=n;++i)
- {
- scanf("%d",&w[i]);
- int k=abs(w[i])%mod;
- bool flag=false;
- while(hash_table[k]>=-)/*you shu le*/
- {
- if(hash_table[k]==w[i])
- flag=true;
- k++;
- }
- hash_table[k]=w[i];
- if(flag)
- printf("");
- else printf("");
- }
- return ;
- }
2.KMP算法[POJ3461]乌力波
法国作家乔治·佩雷克(Georges Perec,1936-1982)曾经写过一本书,《敏感字母》(La disparition),全篇没有一个字母‘e’。他是乌力波小组(Oulipo Group)的一员。下面是他书中的一段话:
Tout avait Pair normal, mais tout s’affirmait faux. Tout avait Fair normal, d’abord, puis surgissait l’inhumain, l’affolant. Il aurait voulu savoir où s’articulait l’association qui l’unissait au roman : stir son tapis, assaillant à tout instant son imagination, l’intuition d’un tabou, la vision d’un mal obscur, d’un quoi vacant, d’un non-dit : la vision, l’avision d’un oubli commandant tout, où s’abolissait la raison : tout avait l’air normal mais…
佩雷克很可能在下面的比赛中得到高分(当然,也有可能是低分)。在这个比赛中,人们被要求针对一个主题写出甚至是意味深长的文章,并且让一个给定的“单词”出现次数尽量少。我们的任务是给评委会编写一个程序来数单词出现了几次,用以得出参赛者最终的排名。参赛者经常会写一长串废话,例如500000个连续的‘T’。并且他们不用空格。
因此我们想要尽快找到一个单词出现的频数,即一个给定的字符串在文章中出现了几次。更加正式地,给出字母表{'A','B','C',...,'Z'}和两个仅有字母表中字母组成的有限字符串:单词W和文章T,找到W在T中出现的次数。这里“出现”意味着W中所有的连续字符都必须对应T中的连续字符。T中出现的两个W可能会部分重叠。
【输入格式】
输入包含多组数据。
输入文件的第一行有一个整数,代表数据组数。接下来是这些数据,以如下格式给出:
第一行是单词W,一个由{'A','B','C',...,'Z'}中字母组成的字符串,保证1<=|W|<=10000(|W|代表字符串W的长度)
第二行是文章T,一个由{'A','B','C',...,'Z'}中字母组成的字符串,保证|W|<=|T|<=1000000。
【输出格式】
对每组数据输出一行一个整数,即W在T中出现的次数。
【样例输入】
3
BAPC
BAPC
AZA
AZAZAZA
VERDI
AVERDXIVYERDIAN
样例输出
1
3
0
- #include<iostream>
- using namespace std;
- #include<cstdio>
- #include<cstring>
- #define MT 1000100
- #define MW 10100
- char w[MW],t[MT];
- int ans=;
- int fail[MW];
- void input()
- {
- memset(w,,sizeof(w));
- memset(t,,sizeof(t));
- memset(fail,,sizeof(fail));
- scanf("%s%s",w,t);
- }
- void make_fail()
- {
- int k=;
- int lenw=strlen(w);
- fail[]=;//
- for(int i=;i<=lenw;++i)//
- {
- while(k>&&w[i]!=w[k])
- k=fail[k-];//
- if(w[i]==w[k])
- k++;
- fail[i]=k;
- }
- }
- void kmp()
- {
- int lent=strlen(t);//mu
- int lenw=strlen(w);
- int k=;
- for(int i=;i<=lent;++i)
- {
- while(k>&&t[i]!=w[k])
- k=fail[k-];//
- if(t[i]==w[k])
- {
- k++;
- }
- if(k==lenw)
- {
- ans++;
- k=fail[k-];
- }
- }
- }
- int main()
- {
- int t1;
- scanf("%d",&t1);
- while(t1--)
- {
- input();
- make_fail();
- ans=;
- kmp();
- printf("%d\n",ans);
- }
- return ;
- }
3.【AC自动机】
BZOJ 3172: [Tjoi2013]单词
Description
某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。
Input
第一个一个整数N,表示有多少个单词,接下来N行每行一个单词。每个单词由小写字母组成,N<=200,单词长度不超过10^6
Output
输出N个整数,第i行的数字表示第i个单词在文章中出现了多少次。
Sample Input
a
aa
aaa
Sample Output
3
1
- #include<iostream>
- using namespace std;
- #define N 1000100/*最长字符串的长度*/
- #include<cstring>
- #include<cstdio>
- int topt=,n;
- struct Trie{
- int nxt[],cnt,fail;
- Trie()
- {
- memset(nxt,,sizeof(nxt));
- cnt=fail=;/*结构体初始化*/
- }
- }trie[N];
- int pos[],que[N],head=-,tail=-;
- void build_trie(int k,char*str)/*建trie书的过程*/
- {
- int now=;
- while(*str)
- {
- if(!trie[now].nxt[*str-'a'])
- trie[now].nxt[*str-'a']=++topt;
- now=trie[now].nxt[*str-'a'];
- str++;
- trie[now].cnt++;/*记录该前缀出现的次数*/
- }
- pos[k]=now;/*记录第k个单词终点的节点编号*/
- }
- void input()
- {
- scanf("%d",&n);
- for(int i=;i<=n;++i)
- {
- char s[N];
- scanf("%s",s);
- build_trie(i,s);
- }
- }
- void make_fail()/*生成fail数组*/
- {
- int now=;
- trie[now].fail=;
- for(int i=;i<;++i)/*根节点及第一层点的入队处理*/
- {
- if(!trie[now].nxt[i]) continue;
- que[++tail]=trie[now].nxt[i];
- trie[trie[now].nxt[i]].fail=;
- }
- int p;
- while(head<tail)
- {
- ++head;
- now=que[head];
- for(int i=;i<;++i)
- {
- if(!trie[now].nxt[i]) continue;
- que[++tail]=trie[now].nxt[i];/*如果存在,就入队*/
- p=trie[now].fail;/*p是该节点父亲的fail指针*/
- while(!trie[p].nxt[i]&&p)/*回调的过程*/
- p=trie[p].fail;
- if(trie[p].nxt[i])
- trie[trie[now].nxt[i]].fail=trie[p].nxt[i];
- else trie[trie[now].nxt[i]].fail=;
- }
- }
- for(int i=tail;i>=;--i)
- trie[trie[que[i]].fail].cnt+=trie[que[i]].cnt/*关键:从队列的反方向,因为是广搜,所以反方向的1<--3<--5都有该单词的cnt,只有反向才能把cnt一层层传上来,因为fail不一定会指向我们想要的位置*/;
- for(int i=;i<=n;++i)
- printf("%d\n",trie[pos[i]].cnt);/*这是该单词的这终结点,但是也许别的单词中也会包括该单词,因为这是广搜,所以包含该单词的单词终结位置的fail一定指向当前这个单词,上面那一步就是,把这里的单词数转移上去*/
- }
- int main()
- {
- input();
- make_fail();
- return ;
- }
4.【manacher算法--回文串】
Time Limit: 15000MS | Memory Limit: 65536K | |
Total Submissions: 6831 | Accepted: 2534 |
Description
A string is said to be a palindrome if it reads the same both forwards and backwards, for example "madam" is a palindrome while "acm" is not.
The students recognized that this is a classical problem but couldn't come up with a solution better than iterating over all substrings and checking whether they are palindrome or not, obviously this algorithm is not efficient at all, after a while Andy raised his hand and said "Okay, I've a better algorithm" and before he starts to explain his idea he stopped for a moment and then said "Well, I've an even better algorithm!".
If you think you know Andy's final solution then prove it! Given a string of at most 1000000 characters find and print the length of the largest palindrome inside this string.
Input
Output
Sample Input
- abcbabcbabcba
- abacacbaaaab
- END
Sample Output
- Case 1: 13
- Case 2: 6
题目大意:求最长回文子串的长度
- #define L 1000100
- #include<iostream>
- using namespace std;
- #include<cstdio>
- #include<cstring>
- using namespace std;
- char s[L*+];
- int p[L*+],id;
- int lens;
- int ans=-;
- void input()
- {
- lens=strlen(s);
- for(int i=lens;i>=;--i)
- {
- s[i+i+]=s[i];/*预处理加#,偶数是原字母,奇数和0是#*/
- s[i+i+]='#';
- }
- s[]='#';
- }
- void manacher()
- {
- ans=;
- id=;p[id]=;
- for(int i=;i<=lens*+;++i)/*别忘了跑2*lens+2才可以*/
- {
- if(id+p[id]>i)
- p[i]=min(p[*id-i],id+p[id]-i);
- while(s[i+p[i]]==s[i-p[i]])
- p[i]++;
- if(i+p[i]>id+p[id])
- id=i;
- ans=max(ans,p[i]);
- }
- }
- int main()
- {
- int topt=;
- while(scanf("%s",s)==)
- {
- ++topt;
- if(strcmp(s,"END")==) break;
- input();
- manacher();
- printf("Case %d: %d\n",topt,ans-);/*ans-1是因为添加了#*/
- memset(s,,sizeof(s));/*不要忘记初始化*/
- memset(p,,sizeof(p));
- }
- return ;
- }
清北学堂学习总结 day2 字符串 练习的更多相关文章
- 清北学堂学习总结day2
今天是钟皓曦大佬讲课,先来膜一波 %%%%% •数论 数论是这次培训的一个重点,那么什么是数论呢? 数论是研究整数性质的东西,所以理论上day2不会涉及小数QwQ (切入正题) •整除性: 设a, ...
- 清北学堂学习总结day1
上午篇 一.高精度计算: [以下内容先只考虑非负数情况] •高精度加法: 思路:[模拟竖式运算] 注意:[进位] •高精度减法: 思路:[同加法类似,模拟竖式运算,进位变退位] 注意: [结果为负数的 ...
- 清北学堂学习总结day3
小学知识总结 上午篇 •积性函数的卷积公式 (1)(f * g)( n ) = ∑(d|n) f( d ) x g ( n / d ) (2)代码实现 LL f[N], g[N], h[N]; voi ...
- 清北学堂学习总结 day1 数据结构 练习
1.二叉搜索树 STL set直接做就可以了 2.树状数组+差分数列: codevs 1081 线段树练习 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Maste ...
- 7月清北学堂培训 Day 3
今天是丁明朔老师的讲授~ 数据结构 绪论 下面是天天见的: 栈,队列: 堆: 并查集: 树状数组: 线段树: 平衡树: 下面是不常见的: 主席树: 树链剖分: 树套树: 下面是清北学堂课程表里的: S ...
- 清北学堂2017NOIP冬令营入学测试P4745 B’s problem(b)
清北学堂2017NOIP冬令营入学测试 P4745 B's problem(b) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描 ...
- 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)
清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...
- 济南清北学堂游记 Day 1.
快住手!这根本不是暴力! 刷了一整天的题就是了..上午三道题的画风还算挺正常,估计是第一天,给点水题做做算了.. rqy大佬AK了上午的比赛! 当时我t2暴力写挂,还以为需要用啥奇怪的算法,后来发现, ...
- 清明培训 清北学堂 DAY1
今天是李昊老师的讲授~~ 总结了一下今天的内容: 1.高精度算法 (1) 高精度加法 思路:模拟竖式运算 注意:进位 优化:压位 程序代码: #include<iostream>#in ...
随机推荐
- Android 搭建Linux系统
本文精心从网上搜罗出相关资料并整理,含有大量外部链接 安卓手机上安装linux大致分为两种方案 一.使用Linux Deploy 二.使用 Linux on Android 本文对Linux Depl ...
- 重载jquery on方法实现click事件在移动端的快速响应
额,这个标题取的还真是挺装的... 其实我想表达的是jquery click事件如何在移动端自动转换成touchstart事件. 因为移动端click事件会比touchstart事件慢几拍 移动设备某 ...
- 33、求按从小到大的顺序的第N个丑数
一.题目 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 二.解法 ...
- 新一代的USB 3.0传输规格
通用序列总线(USB) 从1996问世以来,一统个人电脑外部连接界面,且延伸至各式消费性产品,早已成为现代人生活的一部分.2000年发表的USB 2.0 High-speed规格,提供了480Mbps ...
- [MySQL] gap lock/next-key lock浅析
当InnoDB在判断行锁是否冲突的时候, 除了最基本的IS/IX/S/X锁的冲突判断意外, InnoDB还将锁细分为如下几种子类型: record lock (RK) 记录锁, 仅仅锁住索引记录的一行 ...
- Mac 终端自动补全忽略大小写
打开终端,输入:nano .inputrc 在里面粘贴上以下语句: set completion-ignore-case onset show-all-if-ambiguous onTAB: menu ...
- Spring Boot 在接收上传文件时,文件过大异常处理问题
Spring Boot 在接收上传文件时,文件过大时,或者请求过大,spring内部处理都会抛出异常,并且捕获不到. 虽然可以通过调节配置,增大 请求的限制值. 但是还是不太方便. 之所以捕获不到异常 ...
- IP负载均衡技术
参考链接:http://www.360doc.com/content/12/1117/19/820209_248442094.shtml
- Myeclipse编辑jsp文件很卡是什么原因?
可能是配置问题,配置的时候不要把myeclipse连接到网络.否则每次编辑的时候要在网上查找,所以照成很卡.window->perferences->java->Installed ...
- IEEEXtreme 10.0 - Playing 20 Questions with an Unreliable Friend
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Playing 20 Questions with an Unreliable Friend 题目来源 第1 ...