HDU 5059 Harry And Biological Teacher
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5069
题意:给出n个串,m个询问,每个询问(u,v),求u的一个最长后缀是v的前缀。
思路:离线。将关于u的后缀的查询放在一起,然后将u插入后缀自动机。对于每个v跑一遍即可。
struct SAM { SAM *son[4],*pre; int len; int ok; void init() { clr(son,0); pre=0; ok=0; } }; SAM sam[N],*head,*last; int cnt; void initSam() { head=last=&sam[0]; head->init(); cnt=1; } int get(char x) { if(x=='A') return 0; if(x=='T') return 1; if(x=='G') return 2; return 3; } void insert(int x) { SAM *p=&sam[cnt++],*u=last; p->init(); p->len=last->len+1; last=p; for(;u&&!u->son[x];u=u->pre) u->son[x]=p; if(!u) p->pre=head; else if(u->son[x]->len==u->len+1) p->pre=u->son[x]; else { SAM *r=&sam[cnt++],*q=u->son[x]; *r=*q; r->len=u->len+1; p->pre=q->pre=r; for(;u&&u->son[x]==q;u=u->pre) u->son[x]=r; } } char s[N*2]; int cur; int start[N],len[N]; vector<pair<int,int> > V[N]; int ans[N]; map<int,int> mp; int n,m; int main() { // FFF; while(scanf("%d%d",&n,&m)!=-1) { cur=0; int i; for(i=1;i<=n;i++) { scanf("%s",s+cur); start[i]=cur; len[i]=strlen(s+cur); cur+=len[i]+3; } for(i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); V[u].pb(MP(v,i)); } for(i=1;i<=n;i++) if(SZ(V[i])>0) { int j; initSam(); for(j=start[i];s[j];j++) insert(get(s[j])); SAM *p=last; while(p!=NULL) p->ok=1,p=p->pre; mp.clear(); for(j=0;j<SZ(V[i]);j++) { int k=V[i][j].first; int id=V[i][j].second; if(mp.count(k)) { ans[id]=mp[k]; continue; } SAM *p=head; int t,tmp=0,cur=0; for(t=start[k];s[t];t++) { int x=get(s[t]); if(p->son[x]) { cur++; p=p->son[x]; if(p->ok) tmp=max(tmp,cur); } else break; } mp[k]=tmp; ans[id]=tmp; } V[i].clear(); } for(i=1;i<=m;i++) printf("%d\n",ans[i]); } }
HDU 5059 Harry And Biological Teacher的更多相关文章
- HDU 5069 Harry And Biological Teacher(AC自动机+线段树)
题意 给定 \(n\) 个字符串,\(m\) 个询问,每次询问 \(a\) 字符串的后缀和 \(b\) 字符串的前缀最多能匹配多长. \(1\leq n,m \leq 10^5\) 思路 多串匹配,考 ...
- hdu 5894 hannnnah_j’s Biological Test 组合数学
传送门:hdu 5894 hannnnah_j’s Biological Test 题目大意:n个座位,m个学生,使每个学生的间隔至少为k个座位 组合中的插空法 思路:每个学生先去掉k个空位间隔,剩下 ...
- HDU 5066 Harry And Physical Teacher(物理题)
HDU 5066 Harry And Physical Teacher 思路:利用物理里面的动量守恒公式.因为保证小车质量远大于小球.所以能够把小车质量当成无穷大带进去,得到答案为2 * v0 - v ...
- HDU 5059 Help him(细节)
HDU 5059 Help him 题目链接 直接用字符串去比較就可以,先推断原数字正确不对,然后写一个推断函数,注意细节,然后注意判掉空串情况 代码: #include <cstdio> ...
- HDU 5894 hannnnah_j’s Biological Test【组合数学】
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5894 题意: 一个圆桌上有$n$个不同的位置,$m$个相同的人安排到这$n$个位置上,要求两人相邻的 ...
- BestCoder12 1002.Help him(hdu 5059) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5059 题目意思:就是输入一行不多于 100 的字符串(除了'\n' 和 '\r' 的任意字符),问是否 ...
- hdu 5059 简单字符串处理
http://acm.hdu.edu.cn/showproblem.php?pid=5059 确定输入的数是否在(a,b)内 简单字符串处理 #include <cstdio> #incl ...
- HDU 5059 Help him(简单模拟题)
http://acm.hdu.edu.cn/showproblem.php?pid=5059 题目大意: 给定一个字符串,如果这个字符串是一个整数,并且这个整数在[a,b]的范围之内(包括a,b),那 ...
- hdu 5066 Harry And Physical Teacher(Bestcoder Round #14)
Harry And Physical Teacher Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
随机推荐
- sql 把一列的数据按逗号分隔转换成多行
ALTER proc [dbo].[ModifyWkCashAccountNo]asbeginset xact_abort onbegin transactiondeclare @errors int ...
- IE已经被抛弃,但是不能遗忘
虽然IE的兼容问题,在我写这篇文章的时候基本已经被抛弃了,但是我觉得还是应该了解一下最基本的解决办法. 就像中国的历史已经过去,但是我们不能忘记一样的. 逐个版本解决法 .bb{ background ...
- Asp.net中后台C#数组与前台Javascript数组交互
摘自:http://blog.csdn.net/a6225301/article/details/20003305 在上一篇<asp.net中javascript与后台c#交互>中实现了前 ...
- LoadRunner11下载以及详细破解说明【最新】
Loadrunner11破解所需两个dll文件以及自动删除注册表工具,使用方法见附件readme.也可安装网上的办法,手动删除注册表项. 下载破解文件lm70.dll和mlr5lprg.dll lm7 ...
- 160927、用jquery 重置表单的方法
清空 我们项目小小部分的搜索条件: 客户要做的是,只要一键 "清空搜索条件" 即可清空维护地点.订单ID等条件. js函数 //重置表单 function resetform(){ ...
- altera soc体验之旅 FPGA与ARM的窃窃私语
喜大普奔,公司要评估用SOC做产品,我就自然而然的被安排了学习和评估的工作,于是,每天的工作就是开始研究soc了.其实,只要能静下心来学习,一切都还是能够弄出来的. 以前像个无头苍蝇一样到处乱撞, ...
- C#:Winform技巧
1.如何设置winform窗体透明,但是显示的内容不透明? 方法:BackColor设置:Red(任意)在窗体属性里设置一个“TransparenceKey”的属性为Red 2.如何让C#编译不安全代 ...
- asp.net 分页-利用后台直接生成html分页
一直想做一个属于自己的分页, 1:我试过用datapage,虽然是很好用,但是必须要配合datalist才能使用,感觉不太好 2:自己写分页控件,目前正在摸索中,关键是怎么分页的问题,有的是用data ...
- JAVA中int、String的类型相互转换
int -> String int i=12345;String s="";第一种方法:s=i+"";第二种方法:s=String.valueOf(i); ...
- a different object with the same identifier,同一个session中存在不同的对象问题
使用hibernate的函数 session.merge()函数,提交处于游离态的对象. merge在执行更新之前会将两个标识符相同的对象进行合并,具体合并的方向是向exituser2合并.