摘要: http://poj.org/problem?id=3630 很无奈的又一次验证了poj数据弱爆的真理!hdoj用STL根本水不过去,一直是TLE,poj则一下水过.... 今天先这样了,明天再用字典树来试一下。#include<iostream>#include<string>#include<vector>#include<algorithm>usingnamespacestd;intmain(){vector<string>v;strings;intn;cin>>n;inti,b;while(cin>>n 阅读全文
posted @ 2011-10-11 23:40 追逐. 阅读(192) 评论(0) 推荐(0) 编辑
摘要: 拜读了大牛们的代码,对AC自动机的了解又加深了一步。 不过刚才去一个QQ群推荐的题集里看了下,里面的题目还是不能顺利的解决,看来还需要更深入的去了解。 下面是hdu2222的题解,感觉可以作为不错的AC自动机模板代码。#include<iostream>usingnamespacestd;constintkind=26;structnode{node*fail;//失败指针node*next[kind];//Tire每个节点的26个子节点(最多26个字母)intcount;//是否为该单词的最后一个节点node(){//构造函数初始化fail=NULL;count=0;memset 阅读全文
posted @ 2011-10-10 23:04 追逐. 阅读(684) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1873 主要是排序,sort和qsort是不稳定排序,所以在此题种不可用。而stable_sort为稳定排序,每次IN后对vector排序即可。#include<iostream>#include<vector>#include<algorithm>usingnamespacestd;structpain{inttip,id;};intcmp(paina,painb){returna.tip>b.tip;}intmain(){intn;typedefvect 阅读全文
posted @ 2011-10-10 12:16 追逐. 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有模式树(字典树)Trie和KMP模式匹配算法的基础知识。AC自动机算法分为3步:构造一棵Trie树,构造失败指针和模式匹配过程。 如果你对KMP算法和了解的话,应该知道KMP算法中的next函数(shift函数或者fail函数)是干什么用的。KMP中我们用两个指针i和j分别表示,A[i-j+ 1..i]与B[1..j]完全相等。也就是.. 阅读全文
posted @ 2011-10-01 19:16 追逐. 阅读(279) 评论(0) 推荐(0) 编辑
摘要: Trie树就是字符树,其核心思想就是空间换时间。举个简单的例子。给你100000个长度不超过10的单词。对于每一个单词,我们要判断他出没出现过,如果出现了,第一次出现第几个位置。这题当然可以用hash来,但是我要介绍的是trie树。在某些方面它的用途更大。比如说对于某一个单词,我要询问它的前缀是否出现过。这样hash就不好搞了,而用trie还是很简单。现在回到例子中,如果我们用最傻的方法,对于每一个单词,我们都要去查找它前面的单词中是否有它。那么这个算法的复杂度就是O(n^2)。显然对于100000的范围难以接受。现在我们换个思路想。假设我要查询的单词是abcd,那么在他前面的单词中,以b,c 阅读全文
posted @ 2011-10-01 19:15 追逐. 阅读(331) 评论(0) 推荐(0) 编辑
摘要: 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP算法是拿来处理字符串匹配的。换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串)。比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串。你可以委婉地问你的MM:“假如你要向你喜欢的人表白的话,我的名字是你的告白语中的子串吗?” 解决这类问题,通常我们的方法是枚举从A串的什么位置起开始与B匹配,然后验证是否匹配。假如A串长度为n,B串长度为m,那么这种方法的复杂度是O (mn)的。虽然很多时候复杂度达不 阅读全文
posted @ 2011-10-01 19:13 追逐. 阅读(395) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=2479 #include<iostream>#include<fstream>#include<cstring>usingnamespacestd;intmain(){fstreamcin("x.in");intn,i,j,k,h,g,ans=-9999;inta[105][105],dp[105],b[105];while(cin>>n!=0){for(i=0;i<n;i++)for(j=0;j<n;j++)cin>>a[i][j];fo 阅读全文
posted @ 2011-09-26 22:55 追逐. 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=2479 基础DP题,跟以前做的最大子段和差不多。数据量比较大,一开始用cin,cout输入输出,超时,改成scanf就好了。#include<iostream>#include<fstream>#include<algorithm>#include<cstring>usingnamespacestd;intdp[50005],a[50005];intmain(){//fstreamcin("x.in");intt,n,i;memset(dp,0,sizeof(dp 阅读全文
posted @ 2011-09-25 22:36 追逐. 阅读(157) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=3624#include<iostream>#include<fstream>#include<cstring>usingnamespacestd;intn,m;intw[4000],d[4000];intdp[20000];intmax(inta,intb){if(a>b)returna;elsereturnb;}intmain(){//fstreamcin("x.in");cin>>n>>m;memset(dp,0,sizeof(dp));fo 阅读全文
posted @ 2011-09-24 11:50 追逐. 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 题目链接: http://poj.org/problem?id=1028 4、5个月前就做这题了,当时是用数组模拟的,结果RE到吐血!这次直接用STL模板,一次AC!文盲的悲哀啊!#include<iostream>#include<fstream>#include<string>#include<stack>usingnamespacestd;intmain(){stack<string>a;stack<string>b;//b记录BACK操作前的页面stringc;a.push("http://www.acm 阅读全文
posted @ 2011-09-19 22:29 追逐. 阅读(443) 评论(0) 推荐(0) 编辑