链接: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的更多相关文章

  1. HDU 5069 Harry And Biological Teacher(AC自动机+线段树)

    题意 给定 \(n\) 个字符串,\(m\) 个询问,每次询问 \(a\) 字符串的后缀和 \(b\) 字符串的前缀最多能匹配多长. \(1\leq n,m \leq 10^5\) 思路 多串匹配,考 ...

  2. hdu 5894 hannnnah_j’s Biological Test 组合数学

    传送门:hdu 5894 hannnnah_j’s Biological Test 题目大意:n个座位,m个学生,使每个学生的间隔至少为k个座位 组合中的插空法 思路:每个学生先去掉k个空位间隔,剩下 ...

  3. HDU 5066 Harry And Physical Teacher(物理题)

    HDU 5066 Harry And Physical Teacher 思路:利用物理里面的动量守恒公式.因为保证小车质量远大于小球.所以能够把小车质量当成无穷大带进去,得到答案为2 * v0 - v ...

  4. HDU 5059 Help him(细节)

    HDU 5059 Help him 题目链接 直接用字符串去比較就可以,先推断原数字正确不对,然后写一个推断函数,注意细节,然后注意判掉空串情况 代码: #include <cstdio> ...

  5. HDU 5894 hannnnah_j’s Biological Test【组合数学】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5894 题意: 一个圆桌上有$n$个不同的位置,$m$个相同的人安排到这$n$个位置上,要求两人相邻的 ...

  6. BestCoder12 1002.Help him(hdu 5059) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5059 题目意思:就是输入一行不多于 100 的字符串(除了'\n' 和 '\r' 的任意字符),问是否 ...

  7. hdu 5059 简单字符串处理

    http://acm.hdu.edu.cn/showproblem.php?pid=5059 确定输入的数是否在(a,b)内 简单字符串处理 #include <cstdio> #incl ...

  8. HDU 5059 Help him(简单模拟题)

    http://acm.hdu.edu.cn/showproblem.php?pid=5059 题目大意: 给定一个字符串,如果这个字符串是一个整数,并且这个整数在[a,b]的范围之内(包括a,b),那 ...

  9. 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 ...

随机推荐

  1. sql 把一列的数据按逗号分隔转换成多行

    ALTER proc [dbo].[ModifyWkCashAccountNo]asbeginset xact_abort onbegin transactiondeclare @errors int ...

  2. IE已经被抛弃,但是不能遗忘

    虽然IE的兼容问题,在我写这篇文章的时候基本已经被抛弃了,但是我觉得还是应该了解一下最基本的解决办法. 就像中国的历史已经过去,但是我们不能忘记一样的. 逐个版本解决法 .bb{ background ...

  3. Asp.net中后台C#数组与前台Javascript数组交互

    摘自:http://blog.csdn.net/a6225301/article/details/20003305 在上一篇<asp.net中javascript与后台c#交互>中实现了前 ...

  4. LoadRunner11下载以及详细破解说明【最新】

    Loadrunner11破解所需两个dll文件以及自动删除注册表工具,使用方法见附件readme.也可安装网上的办法,手动删除注册表项. 下载破解文件lm70.dll和mlr5lprg.dll lm7 ...

  5. 160927、用jquery 重置表单的方法

    清空 我们项目小小部分的搜索条件: 客户要做的是,只要一键 "清空搜索条件" 即可清空维护地点.订单ID等条件. js函数 //重置表单 function resetform(){ ...

  6. altera soc体验之旅 FPGA与ARM的窃窃私语

      喜大普奔,公司要评估用SOC做产品,我就自然而然的被安排了学习和评估的工作,于是,每天的工作就是开始研究soc了.其实,只要能静下心来学习,一切都还是能够弄出来的. 以前像个无头苍蝇一样到处乱撞, ...

  7. C#:Winform技巧

    1.如何设置winform窗体透明,但是显示的内容不透明? 方法:BackColor设置:Red(任意)在窗体属性里设置一个“TransparenceKey”的属性为Red 2.如何让C#编译不安全代 ...

  8. asp.net 分页-利用后台直接生成html分页

    一直想做一个属于自己的分页, 1:我试过用datapage,虽然是很好用,但是必须要配合datalist才能使用,感觉不太好 2:自己写分页控件,目前正在摸索中,关键是怎么分页的问题,有的是用data ...

  9. JAVA中int、String的类型相互转换

    int -> String int i=12345;String s="";第一种方法:s=i+"";第二种方法:s=String.valueOf(i); ...

  10. a different object with the same identifier,同一个session中存在不同的对象问题

    使用hibernate的函数 session.merge()函数,提交处于游离态的对象. merge在执行更新之前会将两个标识符相同的对象进行合并,具体合并的方向是向exituser2合并.