找规律
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
无限大的棋盘有一只走‘日’的马呆在0,0处,也是坐标原点,(存在四个象限),给你(x,y)问你要至少跳多少步才能跳过去
不妨设$x>y$
$x\le2y$,可以证明当x和y足够大的时候
$(x+y)\mod3=0$时,我们只需要$\frac{x+y}{3}$步,这些步数由两种跳跃组成,他们分别是(1,2)和(2,1)
$(x+y)\mod 3=1$时,我们选择(1,-2)或者(-2,1)来跳跃,跳跃之后$(x+y)\mod3=0$所以一共需要$\frac{x+y}{3}+1$步
同理$(x+y)\mod 3=2$时一共需要$\frac{x+y}{3}+2$步
综合为需要$\frac{x+y}{3}+((x+y)\mod 3)$步
同样分析出$x>2y$在$x$和$y$足够大的时候,需要$y+\frac{x-2y}{4}\times2+(x ...
字符串Hash
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
就像cantor映射一样,字符串hash采取一种更加随机化的映射,它的通项公式为$hash[i]=\sum _{j=0}^{i}s[j]*p^{i-j}$,如此将一个字符串随机映射到了一个数字上,
我们来看这个公式的意义,他把一个字符串映射到了一个p进制数字上,位数代表着字符串的长度,然后我们将这个p进制数转化为十进制数并对1e9+7取模来存储,通项公式不好求,但是我们可以通过递推公式来求
$hash[i]=hash[i-1]\cdot p+s[i]$
这个公式就比较友好了,另外对于任意区间,我们有这个公式
$hash[l~r] = hash[r] - hash[l - 1] \cdot pow(p, r - l + 1)$
123456789101112131415161718192021222324252627282930313233343536 ...
KMP算法
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
123456789101112131415161718192021222324252627282930313233343536inline void GetNext(char *s) { int l = strlen(s), t; next[0] = -1; for (int i = 1; i < l; ++i) { t = next[i - 1]; while (s[t + 1] != s[i] && t >= 0) t = next[t]; if (s[t + 1] == s[i]) next[i] = t + 1; else next[i] = -1; }}inline v ...
最小费用最大流
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051const double eps=1e-8;struct MCMF{ static const int maxn=200,maxm=40000; struct star{int v,nex;double c,w;} edge[maxm<<1]; int head[maxn],cnt,n; int inq[maxn],pre[maxn]; double dist[maxn]; void ini(int n){ cnt=-1;this->n=n; for(int i=0;i<=n;i++) ...