ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:262.31KB ,
资源ID:6805428      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6805428.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(acm 竞赛题知识点总结.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

acm 竞赛题知识点总结.docx

1、acm 竞赛题知识点总结 滚动数组(转)版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明利用在数组长度N很大的情况下能达到压缩存储的作用。一般还是用在DP题目中,因为DP题目是一个自下而上的扩展过程,我们常常用到是连续的解,而每次用到的只是解集中的最后几个解,所以以滚动数组形式能大大减少内存开支。用法:#include using namespace std;int d3;int main() d0 = 1;d1 = 1; for( int i = 2; i 100; i+) di % 3 = d(i - 1) % 3 + d(i - 2 % 3; cout d99 % 3 e

2、ndl; / Fibonacci. return 0;int i,j,d2100;/比d100100省多了for(i=1;i100;i+) for(j=0;j100;j+) di%2j=d(i-1)%2j+di%2j-1;/ DP .滚动数组 举个简单的例子:int i,d100;d0=1;d1=1;for(i=2;i100;i+)di=di-1+di-2;printf(%d,d99);上面这个循环di只需要解集中的前2个解di-1和di-2;为了节约空间用滚动数组的方法int d3;d0=1;d1=1;for(i=2;i100;i+)di%3=d(i-1)%3+d(i-2)%3;printf

3、(%d,d99%3);注意上面的运算,我们只留了最近的3个解,数组好象在“滚动一样,所以叫滚动数组对于二维数组也可以用这种方法 例如:int i,j,d100100;for(i=1;i100;i+) for(j=0;j100;j+) dij=di-1j+dij-1;上的dij忪便赖于di-1j,dij-1;迿用滚动数组int i,j,d2100;for(i=1;i100;i+) for(j=0;jnextindex=NULL)p-nextindex=newnode();7p=p-nextindex;8i+;910p-count+;/在单词的最后一个节点count+1,代表一个单词11在构造完这

4、棵Tire之后,接下去的工作就是构造下失败指针。构造失败指针的过程概括起来就一句话:设这个节点上的字母为C,沿着他父亲的失败指针走,直到走到一个节点,他的儿子中也有字母为C的节点。然后把当前节点的失败指针指向那个字母也为C的儿子。如果一直走到了root都没找到,那就把失败指针指向root。具体操作起来只需要:先把root加入队列(root的失败指针指向自己或者NULL),这以后我们每处理一个点,就把它的所有儿子加入队列,队列为空。1voidbuild_ac_automation(node*root)2 inti;3root-fail=NULL;4qhead+=root;5while(head!

5、=tail)6node*temp=qtail+;7node*p=NULL;8for(i=0;inexti!=NULL)10if(temp=root)temp-nexti-fail=root;11else12p=temp-fail;13while(p!=NULL)14if(p-nexti!=NULL)15temp-nexti-fail=p-nexti;16break;1718p=p-fail;1920if(p=NULL)temp-nexti-fail=root;2122qhead+=temp-nexti;23242526 从代码观察下构造失败指针的流程:对照图-2来看,首先root的fail指针

6、指向NULL,然后root入队,进入循环。第1次循环的时候,我们需要处理2个节点:root-nexth-a(节点h) 和 root-nexts-a(节点s)。把这2个节点的失败指针指向root,并且先后进入队列,失败指针的指向对应图-2中的(1),(2)两条虚线;第2次进入循环后,从队列中先弹出h,接下来p指向h节点的fail指针指向的节点,也就是root;进入第13行的循环后,p=p-fail也就是p=NULL,这时退出循环,并把节点e的fail指针指向root,对应图-2中的(3),然后节点e进入队列;第3次循环时,弹出的第一个节点a的操作与上一步操作的节点e相同,把a的fail指针指向r

7、oot,对应图-2中的(4),并入队;第4次进入循环时,弹出节点h(图中左边那个),这时操作略有不同。在程序运行到14行时,由于p-nexti!=NULL(root有h这个儿子节点,图中右边那个),这样便把左边那个h节点的失败指针指向右边那个root的儿子节点h,对应图-2中的(5),然后h入队。以此类推:在循环结束后,所有的失败指针就是图-2中的这种形式。最后,我们便可以在AC自动机上查找模式串中出现过哪些单词了。匹配过程分两种情况:(1)当前字符匹配,表示从当前节点沿着树边有一条路径可以到达目标字符,此时只需沿该路径走向下一个节点继续匹配即可,目标字符串指针移向下个字符继续匹配;(2)当前

8、字符不匹配,则去当前节点失败指针所指向的字符继续匹配,匹配过程随着指针指向root结束。重复这2个过程中的任意一个,直到模式串走到结尾为止。1intquery(node*root)2inti=0,cnt=0,index,len=strlen(str);3node*p=root;4while(stri)5index=stri-a;6while(p-nextindex=NULL&p!=root)p=p-fail;7p=p-nextindex;8p=(p=NULL)?root:p;9node*temp=p;10while(temp!=root&temp-count!=-1)11cnt+=temp-c

9、ount;12temp-count=-1;13temp=temp-fail;1415i+;1617returncnt;18 对照图-2,看一下模式匹配这个详细的流程,其中模式串为yasherhs。对于i=0,1。Trie中没有对应的路径,故不做任何操作;i=2,3,4时,指针p走到左下节点e。因为节点e的count信息为1,所以cnt+1,并且讲节点e的count值设置为-1,表示改单词已经出现过了,防止重复计数,最后temp指向e节点的失败指针所指向的节点继续查找,以此类推,最后temp指向root,退出while循环,这个过程中count增加了2。表示找到了2个单词she和he。当i=5时

10、,程序进入第5行,p指向其失败指针的节点,也就是右边那个e节点,随后在第6行指向r节点,r节点的count值为1,从而count+1,循环直到temp指向root为止。最后i=6,7时,找不到任何匹配,匹配过程结束。 到此为止AC自动机算法的详细过程已经全部介绍结束,看一道例题:Problem DescriptionIn the modern time, Search engine came into the life of everybody like Google, Baidu, etc.Wiskey also wants to bring this feature to his imag

11、e retrieval system.Every image have a long description, when users type some keywords to find the image, the system will match the keywords with description of image and show the image which the most keywords be matched.To simplify the problem, giving you a description of image, and some keywords, y

12、ou should tell me how many keywords will be match.InputFirst line will contain one integer means how many cases will follow by.Each case will contain two integers N means the number of keywords and N keywords follow. (N = 10000)Each keyword will only contains characters a-z, and the length will be n

13、ot longer than 50.The last line is the description, and the length will be not longer than 1000000.OutputPrint how many keywords are contained in the description.Sample Input15shehesayshrheryasherhsSample Output31#include2usingnamespacestd;34constintkind=26;5structnode6node*fail;/失败指针7node*nextkind;

14、/Tire每个节点的26个子节点(最多26个字母)8intcount;/是否为该单词的最后一个节点9node()/构造函数初始化10fail=NULL;11count=0;12memset(next,NULL,sizeof(next);1314*q500001;/队列,方便用于bfs构造失败指针15charkeyword51;/输入的单词16charstr1000001;/模式串17inthead,tail;/队列的头尾指针1819voidinsert(char*str,node*root)20node*p=root;21inti=0,index;22while(stri)23index=st

15、ri-a;24if(p-nextindex=NULL)p-nextindex=newnode();25p=p-nextindex;26i+;2728p-count+;2930voidbuild_ac_automation(node*root)31inti;32root-fail=NULL;33qhead+=root;34while(head!=tail)35node*temp=qtail+;36node*p=NULL;37for(i=0;inexti!=NULL)39if(temp=root)temp-nexti-fail=root;40else41p=temp-fail;42while(p!

16、=NULL)43if(p-nexti!=NULL)44temp-nexti-fail=p-nexti;45break;4647p=p-fail;4849if(p=NULL)temp-nexti-fail=root;5051qhead+=temp-nexti;5253545556intquery(node*root)57inti=0,cnt=0,index,len=strlen(str);58node*p=root;59while(stri)60index=stri-a;61while(p-nextindex=NULL&p!=root)p=p-fail;62p=p-nextindex;63p=(p=NULL)?root:p;64node*temp=p;65while(temp!=root&temp-count!=-1)66cnt+=temp-count;67temp-count=-1;68temp=temp-fail;6970i+;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1