Loading

随笔分类 -  算法

摘要:说明:给出文本串和模式串,找出模式串在文本串中出现的位置 解法: 1、暴力解法(BF) int BF(string s, string t, int lens, int lent) { int i = 0, j = 0; while (i < lens && j < lent) { if(s[i] 阅读全文
posted @ 2020-11-12 15:13 qinuna 阅读(151) 评论(0) 推荐(0)
摘要:在一个2k × 2k 个方格组成的棋盘中,有一特殊方格。 在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的棋盘上除特殊方格以外的所有方格,L型骨牌不能旋转,且任何两个L型骨牌不得重叠覆盖。 Sample Input 22 1 21 1 1 Sample Output c*bbccdbcd 阅读全文
posted @ 2020-09-12 23:44 qinuna 阅读(204) 评论(0) 推荐(0)
摘要:广搜求最少转机 struct node { int x; ///城市编号 int s; }q[maxn]; void bfs() { head=tail=1; q[tail].x=1; q[tail++].s=0; vis[start]=1; int cur,flag=0; while(head<t 阅读全文
posted @ 2019-11-03 17:04 qinuna 阅读(107) 评论(0) 推荐(0)
摘要:枚举答案 for(int i=1;i<=len;i++) { if(len%i==0) { k=1; for(int j=i;j<len;j++) { if(s[j]!=s[j%i]) { k=0; break; } } if(k) { cout<<i<<endl; break; } } } 阅读全文
posted @ 2019-11-03 16:55 qinuna 阅读(139) 评论(0) 推荐(0)
摘要:马拉车 #include <iostream> #include <algorithm> #include <string> #include <vector> using namespace std; string Manacher(string s) { string str="$#"; for 阅读全文
posted @ 2019-11-02 22:19 qinuna 阅读(139) 评论(0) 推荐(0)
摘要:加法 只限两个非负整数相加 string add(string a,string b) { string ans; memset(ta,0,sizeof(ta)); memset(tb,0,sizeof(tb)); int lena=a.size(),lenb=b.size(); for(int i 阅读全文
posted @ 2019-10-12 12:56 qinuna 阅读(147) 评论(0) 推荐(0)
摘要:void Pollard_Rho(int x) { if(Test(x)) { ///素数测试 Ans=max(x,Ans); return; } int t1=rand()%(x-1)+1; int t2=t1,b=rand()%(x-1)+1; t2=(mul(t2,t2,x)+b)%x; in 阅读全文
posted @ 2019-10-06 21:06 qinuna 阅读(183) 评论(0) 推荐(0)
摘要:给出n∗n网格,顶部有k个起点,底部有k个相对应的终点每次只能向下或向右走求有多少种从各个起点出发到达对应终点且路径不相交的路径?(对109+7取模) n*m空间从左上角走到右下角只走右或者下的方案数位C(n,n+m) 首先考虑两个棋子的情况,即一个棋子从a1到b1,另一个棋子从a2到b2,不考虑交 阅读全文
posted @ 2019-10-04 23:46 qinuna 阅读(281) 评论(0) 推荐(0)
摘要:前置定理: [a/b]≥c == a≥bc [a/b]≤c == a≤bc [a/b]>c == abc [a/b]<c == a<bc [b/c] == [(b+c-1)/c] == [(b-c+1)/c] f()= Σ [(ai+b)/c] 1: 当a≥c 或 b≥c时 [(ai+b)/c]=[ 阅读全文
posted @ 2019-10-04 16:36 qinuna 阅读(154) 评论(0) 推荐(0)
摘要:普通01分数规划 由n个物品,每个物品由两个属性a和b,选出k个物品,使Σai / Σbi 的值最大 设x=Σai / Σbi, F()=Σa-xΣb, D()=a-xb 当F()=0时,则为答案;当F()>0时,则说明答案小了;当F()<0时,则说明答案大了 二分答案 double l=0,r=1 阅读全文
posted @ 2019-10-02 22:56 qinuna 阅读(190) 评论(0) 推荐(0)
摘要:问题:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二(除以7余2),问物几何? 解法: 1:从5和7的公倍数中找出除3余1的最小数70,从3和7的公倍数中找出被5除余1 的最小数21,从3和5的公倍数中找出被7除余1的最小数15。 2:用70乘2,21乘3,15乘2,相加得233。 3.用 阅读全文
posted @ 2019-10-02 17:04 qinuna 阅读(253) 评论(0) 推荐(0)
摘要:void get_prime(ll x) { ///筛出质因子 ll t=x; if(x%2==0) { v.push_back(2); while(x%2==0) x/=2; } for(ll i=3;i*i<=t;i+=2) { if(x%i==0) v.push_back(i); while( 阅读全文
posted @ 2019-10-01 22:27 qinuna 阅读(123) 评论(0) 推荐(0)
摘要:1:暴力求法,n<15 int C(int n,int m) { int mod=10007; int ans=1; for(int i=n;i>=(n-m+1);i--) ans*=i; while(m) ans/=m--; return ans%mod; } View Code 2:打表 n<1 阅读全文
posted @ 2019-09-23 17:40 qinuna 阅读(148) 评论(0) 推荐(0)
摘要:1.定义: 对于离线数列d,建立差分数组f,则 f[1]=d[1],f[i]=d[i]-d[i-1] 2.性质 (1):对于各个项,有d[2]=d[1]+ (d[1]-d[1]) =f[1]+f[2],即:d[i]=Σf[i] (2):求数列的前缀和 sum(x)=Σ(i=1,x)Σ(j=1,i)f 阅读全文
posted @ 2019-09-22 13:00 qinuna 阅读(127) 评论(0) 推荐(0)
摘要:方格涂色问题 n个方格,用红、粉、绿三色涂每个格子,要求相邻的方格不能同色,且首位两格也不同色,求满足要求的涂法 令f(n)=1,2,...,n-1,n, 前n-2个已涂好色,涂n-1有两种情况 (1):n-1与n-2和1的色都不同,无选择,则f(n-1) (2):n-1与n-2不同,与1相同,则n 阅读全文
posted @ 2019-09-21 22:14 qinuna 阅读(157) 评论(0) 推荐(0)
摘要:1:对原序列进行排序,使其按升序排列。 2:去掉序列中重复的元素。 3:此时序列中各位置的值和位置的序号就是离散化的映射方式。 含重复元素 for(int i=1;i<=n;i++) { cin>>a[i]; b[i]=a[i]; } sort(b+1,b+1+n); int len=unique( 阅读全文
posted @ 2019-09-21 21:06 qinuna 阅读(110) 评论(0) 推荐(0)
摘要:建树 struct node { int L,R; int w;///区间和 int f; }t[4*n+1]; void build(int k,int L,int R) { t[k].L=L; t[k].R=R; if(L==R) { t[k].w=a[i]; ///叶节点 return ; } 阅读全文
posted @ 2019-09-21 13:52 qinuna 阅读(121) 评论(0) 推荐(0)
摘要:给n个货物,k辆车,求每辆车的最大装载量的最小值 #include <iostream> #include <queue> #include <cstdio> #include <cstring> using namespace std; typedef long long ll; int n,k; 阅读全文
posted @ 2019-09-21 13:41 qinuna 阅读(154) 评论(0) 推荐(0)
摘要:Kruskal算法 加边法,初始边数为0,每次选择一条满足条件的最小代价边,加入到最小生成树的边集合里。 适用于简单图 #include <iostream> #include <cstdio> #include <algorithm> using namespace std; int n,m,to 阅读全文
posted @ 2019-09-21 12:28 qinuna 阅读(144) 评论(0) 推荐(0)
摘要:int getf(int x) { return x==f[x]?x:f[x]=getf(f[x]); } void merge(int x,int y) { x=getf(x),y=getf(y); if(x!=y) f[y]=x; } 阅读全文
posted @ 2019-09-20 23:55 qinuna 阅读(98) 评论(0) 推荐(0)