摘要:Substringshttp://acm.hdu.edu.cn/showproblem.php?pid=1238先找到长度最短的字符串,把它的子串和该子串的逆序(按长度从大到小)依次与其他字符串匹配。如果某个子串或它的逆序(如:“ro” ,”or“)和其他字符串都匹配,就返回此时的长度。#include#include#include#include#includeusing namespace std;//下标以0开始的KMPvoid get_next(string b, int *next){ int i=0; int j=-1; next[i]=-1; int l...
阅读全文
摘要:A Simple Problem with Integershttp://poj.org/problem?id=3468#include struct node{ int l,r; __int64 sum; __int64 add;}tree[100000*3];void build(int left,int right,int root){ int mid=(left+right)/2; if(left==right) { tree[root].l=left; tree[root].r=right; tree[ro...
阅读全文
摘要:Tempter of the Bonehttp://acm.hdu.edu.cn/showproblem.php?pid=1010#include #include char map[10][10];int dx[]={1,0,-1,0};int dy[]={0,1,0,-1};bool flag;int n,m,xd,yd,t;void DFS(int x,int y,int t){ if(t==0) //到时间了符合条件flag=true再退出,不符合条件直接退出。 { if(x==xd&&y==yd) flag=true; ...
阅读全文
摘要:Rescuehttp://acm.hdu.edu.cn/showproblem.php?pid=1242题意:"#"是墙,"."是路,"a"是要被救的人,"r"是救援者,"x"是guard。每移动一步,需要一个单位时间。杀死guard也需要一个单位时间。求r到a的最短时间。第一次听说优先队列,不得不承认我还是太弱了!!!#include #include #include #include using namespace std;char map[201][201];bool flag[201]
阅读全文
摘要:HDOJ 1728http://acm.hdu.edu.cn/showproblem.php?pid=1728BFS求最少转过的弯#include #include #include using namespace std;int map[101][101];int w[101][101]; //记录到当前点已经转过个弯,初始化为-1,检测该点是否已遍历struct node{ int x; int y;}now,temp;int dx[]={0,1,0,-1};int dy[]={1,0,-1,0};int m,n;bool BFS(int x1,int y1,int x2,in...
阅读全文
摘要:畅通工程http://acm.hdu.edu.cn/showproblem.php?pid=18631.Prim算法:Prim算法是由一个点(最初的集合)向外延伸,找到与集合相连权值最小的边,然后把对应顶点拉到集合里,直到所有的顶点全部在集合里为止。Prim算法的演示如下:http://sjjp.tjuci.edu.cn/sjjg/DataStructure/DS/web/flashhtml/prim.htm#include const int INF=9999999;const int MAXV=101;int map[MAXV][MAXV];int res;void Prim(int ma
阅读全文
摘要:1703 -- Find them, Catch themhttp://poj.org/problem?id=1703题目大意:有2个敌对帮派,输入D a b表示a,b在不同帮派,输入A a b表示询问a,b是否是在一个帮派。题解:因为并查集中的元素均是有联系的,否则也不会被合并到当前集合中。那么我们就把这2个元素之间的关系量转化为一个偏移量,假设x->y 偏移量0时 x和y同帮派x->y 偏移量1时 x和y不同帮派不妨继续假设,x的当前集合根节点tx,y的当前集合根节点ty。如果tx和ty不相同,那么我们把ty合并到tx上,并且更新deltx[ty]值(注意:deltx[i]表示
阅读全文
摘要:并查集 英文:Disjoint Set,即“不相交集合”将编号分别为1…N的N个对象划分为不相交集合,在每个集合中,选择其中某个元素代表所在集合。常见两种操作:n 合并两个集合n 查找某元素属于哪个集合并查集实现的程序代码:int set[MAXN],rank[MAXN]; //set[i]=k表示i的父节点是k,rank[]存储树的深度。int FindSet(int x){ if(set[x]!=x) set[x]=FindSet(set[x]); return set[x];}//寻找x的根节点void MakeSet(int x){ set[x]=x; rank[x]=1;}//初始化
阅读全文