摘要: 为什么要顺着失配边走?:每次沿失配边走都是当前状态的尽可能最大值 T:文本串 P:模式串 f[i]:P的前i长度子串中前后对称的最大长度(不含"全"(j > f[j])) 阅读全文
posted @ 2019-06-10 20:47 Hanasaki 阅读(121) 评论(0) 推荐(0)
摘要: 只有存在A到非A的环时才会说明题目矛盾 阅读全文
posted @ 2019-06-10 20:01 Hanasaki 阅读(91) 评论(0) 推荐(0)
摘要: //队列优化 O(VE)const int MAXN = 1e5+5; const int INF = 0x3f3f3f3f; struct Edge { int from,to,dist; Edge(int u,int v,int w):from(u),to(v),dist(w){ } }; struct SPFA { int n,m; vectoredg... 阅读全文
posted @ 2019-06-10 18:40 Hanasaki 阅读(227) 评论(0) 推荐(0)
摘要: //普通版本 O(n^2)int vis[n],d[n]; memset(vis,0,sizeof(vis)); for(int i=0;i edges; vector G[maxn]; bool done[maxn]; int d[maxn]; int p[maxn]; void init(int n){ this->n=n; ... 阅读全文
posted @ 2019-06-10 18:38 Hanasaki 阅读(94) 评论(0) 推荐(0)
摘要: //黑白二着色-bicoloring(判断是否为二分图)int color[maxn]; bool bipartite(int u){ for(int i = 0; i < g[u].size(); i++){ int v = g[u][i]; if(color[u] == color[v]) return false; if(!color... 阅读全文
posted @ 2019-06-10 18:31 Hanasaki 阅读(156) 评论(0) 推荐(0)
摘要: int c[maxn]; int topo[maxn]; bool dfs(int u) { c[u] = -1; for(int v = 0; v < n; v++) if(G[u][v]) { if(c[v] < 0) return false; else if(!c[v]&&!dfs(v)) return false; } c... 阅读全文
posted @ 2019-06-10 18:25 Hanasaki 阅读(109) 评论(0) 推荐(0)
摘要: LL china(int n, int* a, int *m){ LL M=1, d, y, x = 0; for(int i = 0; i < n; i++) M *= m[i]; for(int i = 0; i < n; i++) { LL w = M / m[i]; gcd(m[i], w, d, d, y); x ... 阅读全文
posted @ 2019-06-10 17:01 Hanasaki 阅读(109) 评论(0) 推荐(0)
摘要: 欧拉定理: 费马小定理类似欧拉定理的推论 费马小定理: 则(a/b)%p=(a*b^(p-2))%p 阅读全文
posted @ 2019-06-10 16:59 Hanasaki 阅读(147) 评论(0) 推荐(0)
摘要: 假设 ax1+by1=gcd(a,b) (方程一) bx2+(a%b)y2=gcd(b,a%b)(方程二)由欧几里得算法gcd(a,b)=gcd(b,a%b) 得到 ax1+by1=bx2+(a%b)y2即ax1+by1=bx2+(a-a/b*b)y2 => ax1+by1=ay2+b(x2-a/b 阅读全文
posted @ 2019-06-10 11:40 Hanasaki 阅读(178) 评论(0) 推荐(0)
摘要: 给出一个数组,实现一个数据结构以支持查询操作Query(L, R):计算{AL, AL+1, ... , AR} 阅读全文
posted @ 2019-06-10 11:19 Hanasaki 阅读(181) 评论(0) 推荐(0)
摘要: #define lowbit(x) x&-x//lowbit取二进制最后的10*序列(例:lowbit(1000100)= 100) const int S; int c[S] = {0}; void add(int x, int d){ while(x <= S) c[x] += d,x += l 阅读全文
posted @ 2019-06-10 11:06 Hanasaki 阅读(99) 评论(0) 推荐(0)
摘要: void init(){ for(int i = 1; i <= N; i++) f[i] = i; } int find(int k) { return f[k] == k? k : f[k] = find(f[k]); } int union(int a, int b){ f[find(b)] = find(a); } 阅读全文
posted @ 2019-06-10 10:59 Hanasaki 阅读(115) 评论(0) 推荐(0)
摘要: 上述算法已经很高效了而且便于编写,如果还想进一步加速也可以使用线性筛 阅读全文
posted @ 2019-06-10 10:51 Hanasaki 阅读(82) 评论(0) 推荐(0)