05 2012 档案
摘要:poj 1226 Substringshttp://poj.org/problem?id=1226/*题目: 查找最长子串在所有给出的字符串或者它的反转的串中出现分析: 二分枚举所有可能的长度,然后用KMP算法判断该枚举的子串是否在所有给出的字符串 或者它的翻转串中出现。*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int X = 205;char in[X][X],p[X];int fail[X],len[X],n,lens;int mid
阅读全文
摘要:/*题目: 求图中的任意两顶点是否两两互达分析: tanjan算法求得缩点的个数,判断是否为一即可*/#include <iostream>#include <cstdio>#include <vector>#include <cstring>using namespace std;const int V = 100005;vector<int> adj[V];int dfn[V],stack[V],low[V],bcnt,depth,top;bool instack[V];int n,m;//int father[V];void t
阅读全文
摘要:/*题目: 马能否从(1,1)开始走完所有的格点,并且所走的格点之前都没有走过分析: dfs+回溯,分8个方向走,用Next[i,j]记录位置(i,j)的下一位的所在位置*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int X = 30;int n,m;int Next[X][X];bool use[X][X];int dir[8][2] = {{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1}
阅读全文
摘要:/*题目: 听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐啊,他想着得快点 把这消息告诉大家,虽然他手上有所有人的联系方式,但是一个一个联系过去实在 太耗时间和电话费了。他知道其他人也有一些别人的联系方式,这样他可以通知其 他人,再让其他人帮忙通知一下别人。你能帮Wiskey计算出至少要通知多少人,至 少得花多少电话费就能让所有人都被通知到吗?分析: 因为可以通过其他人来通知他们认识的人,所以这幅图可以用强连通分量变成一个 缩点的图,所有相互强连通分支变成一个缩点,求的所有缩点中入度为0的缩点即为 所求的需要通知的最小人数。然...
阅读全文
摘要:题目: 每两人比赛需要裁判(第三名比赛队员充当),并且裁判的等级在两者之间,并且裁判需要在那两名选手的位置之间,问可以安排多少场这样的比赛。分析: 树状数组枚举裁判,分别求到左边位置比该队员的等级高的和等级低的选手数目,当求完之后再从左到右分别删除该项后,求到比他等级高的和等级小的,删除操作只需要modify操作时减掉1即可实现。然后根据乘法原理可知用左边的等级高的*右边等级低的+右边等级高的*左边等级低的。#include <iostream>#include <cstdio>#include <cstring>using namespace std;co
阅读全文
摘要:/*题目: 有n种物品,现给出m种关系,每种关系a,b对应着物品b能够用物品a来换,然后有q个询问(a,b), 问物品a能不能换到物品b。分析: 如果直接dfs求传递闭包的话,会超时的。我们可以重新建图,使得图中没有环,即把强连通分支 变成缩点后用邻接表重新建图,然后dfs求传递闭包即可*/#include <cstdio>#include <vector>#include <cstring>#include <iostream>using namespace std;const int X = 5005;int dfn[X],father[X]
阅读全文
摘要:/*找到强连通分量变成缩点后求给出出度为0的所有点以下用tarjan算法做,第一个是用结构体的邻接链表来做,第二个使用的是vector作为邻接链表*/#include <cstdio>#include <cstring>const int X = 15002;int dfn[X],low[X],stack[X],father[X],depth,top,bcnt;int counter[X],n,m;bool instack[X];struct node{ int v; node *next; void fun() { v = 0; next ...
阅读全文
摘要:/*题目: 现给出各位选手的能力比较并给出自己的朋友的参赛号码,如何组织比赛使得自己的朋友能够获胜分析: 各选手能力比较可以构造一个有向图,而想要使得自己的朋友要赢得比赛,所以他的所在的连通块 必定是入度为0的(假设建图时是以能力大的人作为边的起点)。所以题目可以转换为先建图,然后 再找连通块求缩点,然后判断该缩点是否入度为0,若有朋友在该连通块中,即可判断可以组织这样 的一场比赛。而判断朋友在不在该连通块中,可以先求到所有的入度为0的连通块用数组置为true, 然后直接把所有朋友的所在的连通块置为false,若所有的连通块中只要还有true的连通块,就可判断 不能组织这样的一场比赛*/#in
阅读全文
摘要:/*trie树建立,然后递归打印所有的电话号码(统计次数大于1的打印出来),内存在HOJ上爆了,应该是递归时爆栈了。。。第二个代码两个都是可以AC的,要注意POJ上是只输入一个案例,HOJ上输入多个样例39268K938MS第二个14232K891MS*/#include <cstdio>#include <cstring>#include <iostream>using namespace std;#define X 125char s[X];int n;struct trie{ int id; trie *p[10]; char s[X]; trie()
阅读全文
摘要:/*题目: 该文符合以下三条语法为正确: 1.单一的单词p到z,大写字母:N, C, D, E, I 2.如果字符串s书写正确,则Ns同样正确。 3.若字符串s,t正确的话,则Cst, Dst, Est, and Ist同样正确分析: 递归字符串即可。若当前的字符串的长度为1,符合语法1的话,返回正确。若长度大于1的话, 若当前首字母为N,递归从第二位开始的该字符串,若成功,返回成功。当首字母为C, D, E, I, 若字符串能够分成三个部分X(C, D, E, I),s,t的话,返回成功。 分解字符串的函数可以用string中的substr函数,比如: s = "12345&quo
阅读全文
摘要:/* 题目:给出两种图形的像素表示方法,现在给出其中一种,求另一种的像素表示方法。分析:BFS的思想 */#include <iostream>#include <cstring>#include <cstdio>#include <queue>#include <vector>using namespace std; const int X = 15; struct node{ int x,y;}; int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};//右上左下的方向偏移量char d[] =
阅读全文