acm 竞赛题知识点总结.docx
《acm 竞赛题知识点总结.docx》由会员分享,可在线阅读,更多相关《acm 竞赛题知识点总结.docx(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 滚动数组(转)版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明利用在数组长度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 endl; / Fibon
2、acci. 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(%d,d99%3);注
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在构造完这棵Tire之后,接下去的
4、工作就是构造下失败指针。构造失败指针的过程概括起来就一句话:设这个节点上的字母为C,沿着他父亲的失败指针走,直到走到一个节点,他的儿子中也有字母为C的节点。然后把当前节点的失败指针指向那个字母也为C的儿子。如果一直走到了root都没找到,那就把失败指针指向root。具体操作起来只需要:先把root加入队列(root的失败指针指向自己或者NULL),这以后我们每处理一个点,就把它的所有儿子加入队列,队列为空。1voidbuild_ac_automation(node*root)2 inti;3root-fail=NULL;4qhead+=root;5while(head!=tail)6node*
5、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指针指向NULL,然后roo
6、t入队,进入循环。第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指针指向root,对应图-2中的(
7、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-count;12temp-
9、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时,程序进入第5行,p指向
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- acm 竞赛题知识点总结 竞赛题 知识点 总结
限制150内