POJ 2004
摘要:题意:给出一些字符串,a字符串可以到b字符串,当且仅当在a字符串添加一个字符然后通过排列能够得到b。问最长w1,w2....wm序列,使得wi可以到w[i+1]题解:将每个字符串各自按字母排序后加入hash表中,并记录该key值对应哪些字符串,枚举每一个字符串删除它的某一位后的字符串是否存在于hash表中,通过那个字符串进行对序列长度的更新。由于字符串长度只有20,所以复杂度很低。View Code 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace s
阅读全文
POJ 1084
摘要:题意:n*n的矩形阵(n<=5),由2*n*(n+1)根火柴构成,那么其中会有很多诸如边长为1,为2...为n的正方形,现在可以拿走一些火柴,那么就会有一些正方形被破坏掉。问,在已经拿走一些火柴的情况下,还需要拿走至少多少根就可以把所有的正方形破坏掉。题解:可以用dancing links做,让火柴做为行,让所有的正方形作为列,且如果i火柴能让j正方形破坏掉,就让第i行第j列为1,然后做一次可重复的覆盖,取最小值便可以得到答案。另外,涉及两个优化, 1、最优化剪枝,即最好情况下也不会比当前最优值更优的剪枝。 2、不必一开始就将所有的火柴棍与正方形的对应关系加入到DLX中,应该在读完所有.
阅读全文
POJ 1816
摘要:题意:给出n个模式串,串中除开小写字母外,?代表一个字符,*代表可空的任意字符串,然后再给出m个字符串,问有多少个模式串可以与之匹配。题解:通过模式串建立字典树,接着就是用字符串去dfs就行了,需要注意的就是遇到当前节点为*则还可以继续走当前结点,由于每次dfs要么字典树匹配深度加1,要么字符串位置加1,所以不会出现死循环。另外这题有些卡内存,模式串可能一样,记录每个结点代表哪些模式串时可以参照图论建边的方法,建一个邻接表储存各个结点的模式串信息。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<
阅读全文
POJ 1962
摘要:题意:给定n台电脑,初始都是以自己作为中心。然后一些询问,E x,问x距离中心多远。 I x y 建立一条x到y的长度为|x-y|(mod 1000)的边,且使得原来x机群的中心转移到y机群上。题解:并查集,再额外记录每个点到中心的距离。View Code 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 const int N=30000; 6 int fa[N],dist[N]; 7 int Find(int x) 8 { 9 if(
阅读全文
POJ 2408
摘要:题意:对字符串分类,按照每类大小由大到小输出前五个类,没类中相同的字符串只输出一次。题解:各种STLView Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<queue> 5 #include<string> 6 #include<map> 7 #include<set> 8 using namespace std; 9 struct data10 {11 vector<string> vec;
阅读全文
POJ 1105
摘要:题意:给出一个深度为n的满二叉树(根节点为0层),每层都有一个变量xi,然后2^n叶子结点被赋值为0,1。然后给出m个给xi赋值的情况,遇到0就朝左孩子走,反之就右孩子,将遍历到的m个叶子结点输出来。题解:弄清满二叉树中左孩子就是now*2,右孩子为now*2+1,其他就是模拟了。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int main() 6 { 7 int n,ca=0; 8 while(scanf(&q
阅读全文
POJ 3693
摘要:题意:给定一个字符串,求其中一个由循环子串构成且循环次数最多的一个子串,有多个就输出最小字典序的。题解:后缀数组+RMQ。 1、枚举循环串的长度ll,然后如果它出现了两次,那么它一定会覆盖s[0],s[ll],s[ll*2].....这些点中相邻的两个。 2、再枚举它覆盖的最左边的那个s[ll*i],通过rmq求s[ll*i]与s[ll*i+ll]的最长公共前缀K,可以看出,从[ll*i,ll*i+ll+K]这个区间内,s[ll*i,ll*(i+1)-1]重复出现了K/ll+1次。 3、在第2步中,还有可能就是循环串并不是从ll*i开始的,所以要枚举它前面[ll*(i-1)+1,l...
阅读全文
POJ 2872
摘要:题意:给一个字典和一封邮件,判断是否邮件中的每个单词都出现在字典中。题解:裸字符串hash,勤快点的用C++手写hash,嫌麻烦就直接java吧View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 char hash[1000007][60]; 6 const int mod=1000007; 7 int fac[60]; 8 int getkey(char s[]) 9 {10 int sum=0,i;11 for(i=
阅读全文
POJ 2201
摘要:题意:给出n个点的键值与优先级,然后构建一棵笛卡尔树(中序遍历键值从小到大,且优先级满足最小堆的性质,即父节点的优先级一定比它左右孩子的优先级小)题解:一开始憨厚地去写了一棵Treap,结果TLE,这时才分析,复杂度最坏情况下达到了n^2 = =!于是,先将结点按照键值从小到大排序,这样保证每次插入的结点都在最右端,考察根节点到最右端的那条链,优先级一定是从小到大递增的,而插入的新节点的位置应该位于第一个比它小的那个优先级的右孩子的位置,为了保持排序树的特性,还需要将那个结点原来的右孩子放到新插入结点的左孩子位置,这样操作之后,还是满足笛卡尔树的各种性质。 然后,考虑到一个结点若是被转到...
阅读全文
POJ 3385
摘要:题意:外星人族谱长得很奇葩,AP想把它变得好看一些,好看的定义就是每个结点至多有d个parents,如果它本身超过了,就需要增加虚拟结点???来扩展,问最少需要加多少个虚拟结点。题解:先统计每个孩子的parents个数,如果对于一个外星人,如果它parents个数为m,超过了d,假设要增加k个虚拟结点,那么必须满足m-k*d<=d-k,于是k>=(m-d)/(d-1)View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace st
阅读全文
POJ 3697
摘要:题意:给出一个n个点的无向完全图,然后删去m条边,问还有哪些点与1相连(不包括1)题解:n<=10000,m<=1000000,若直接建反图无论怎样都会暴内存,因为最多1Y条边。于是将删去的边存入hash表中,每次走动时看看边是否在hash表中即可。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int mod=10000007; 6 int hash[mod]; 7 int getkey(i
阅读全文
POJ 2106
摘要:题意:bool表达式求值,V:true;F:false题解:堆栈+优先级判定View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cctype> 5 using namespace std; 6 const int N=1000; 7 char comp(char a,char b) 8 { 9 if(b=='\0')10 {11 if(a=='\0')12 return '=';13 el
阅读全文
POJ 1769
摘要:题意:用m个区间去覆盖1~n,求最小使用数。题解:线段树,覆盖[l,r]:找出线段树上含了l的最小的区间数x,让线段树[l,r]区间取它本身与x的最小值,最后在求n处的最小值即可,复杂度O(mlogn)。开始的时候还想pushdown等操作,结果超时,后来一算发现直接暴力线段树更好。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=50005,M=500005; 6 const int inf=
阅读全文
POJ 2264
摘要:题意:给出两个字符串,求新的长度最小的字符串,使得给出的两个字符串均是它的子序列。题解:要想最小,就是让两个字串合并起来时相同排列的尽可能合并成一个,即最长公共子序列。所以先求一遍最长公共子序列s,同时记录串s第i位分别是给出的两个字符串s1和s2的哪一位,如果对于s的第k位,对应于s1串的第i位,那么位于s1串i位之前未写进答案串的所有字符均应当在s[k]之前写进去,s2同理可得。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace
阅读全文
POJ 3640
摘要:题意:n个学生的5门课程,找出课程组合出现次数最多的,输出选出现次数最多课程组合(不一定一个)的学生人数。题解:对5门课程排序,然后hash判重,接着统计即可。View Code 1 #include<cstring> 2 #include<algorithm> 3 #include<string> 4 #include<map> 5 #include<cstdio> 6 using namespace std; 7 const int mod=1000000; 8 long long hash[mod]; 9 int tot[mod
阅读全文
POJ 2887
摘要:题意:在字符串中插入字符,问第i个字符是谁题解:块状链表,不知为什么splay超时= =!View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=1005000; 7 int bs,top; 8 struct Block 9 {10 int size,next;11 char s[3000];12 void push_back(char ch)13
阅读全文
POJ 2227
摘要:题意:一个矩形区域,高低起伏,求最多储水量。(边界不能储水)题解:先将边界装入优先队列中(高度越小越优先),并标记为已访问。看队首元素四周未访问过的点,1、如果该点不比队首低,则将它加入队列,标记为已访问,即它变成了新的边界。2、该点比队首低,意味着该点可以储水,更新ans值,同时将它加入队列中,但是它的高度为原队首元素的高度,即以它为边界的点不能超过这个高度,同时将该点标记为已访问。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<que
阅读全文
POJ 1509
摘要:题意:将字符串第i位开始的字串提到前面形成A[i],求n个这种串中字典序最小的串的i。题解:1、暴力可以水过。。 2、最小表示法,具体参见IOI2003论文《最小表示法在字符串循环同构问题中的应用》。View Code 1 #include<cstdio> 2 #include<string> 3 #include<algorithm> 4 using namespace std; 5 int main() 6 { 7 int T; 8 for(scanf("%d",&T),getchar();T;T--) 9 {10 char
阅读全文
POJ 1686
摘要:题意:给出两个含未知数的表达式,判断其是否相等。题解:任意给未知数赋值,看起结果是否相同。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cctype> 5 using namespace std; 6 const int N=1000; 7 char op[8]= {'+','-','*','/','(',')','\0'
阅读全文
POJ 3225
摘要:题意:定义对集合的交、并、差、异或,求空集经过一系列操作后的结果。题解:将原点集每一个点乘以2,形成一个新的点集,其中偶数点都对应着原来的点,奇数点对应着不包括它左右两个点的开区间,即2k+1==>(k,k+1),于是区间上所有点都能用整点表示,线段树可求解,对于每一个操作区间,无论开闭,都对应这线段树上的一段线段。1、并运算[a,b],就是将[a,b]赋值为1.(a,b均为对应之后的点)2、交运算[a,b],将除了[a,b]区间以外的线段清0.3、S-[a,b],将[a,b]区间清0.4、[a,b]-S,将[a,b]区间以外线段清0,并且将[a,b]线段所代表区域取反.5、异或运算,上
阅读全文
|
|
|