nxt

_10.11

匆匆过客 提交于 2019-12-01 05:31:22
虽然是虚拟世界,但是心意却不是假的,想要和你在一起的想法一刻都没有改变,回到现实世界我第一想见到的人就是桐人,再一次喜欢你,和你真正的交往,真正的结婚 。 ——亚斯娜《刀剑神域》 1 #include<bits/stdc++.h> 2 #define mod 1000000007LL 3 #define int long long 4 #define LL long long 5 using namespace std; 6 LL fac[105],inv[105],f[105][10005],tmp[2][10005]; 7 LL n,m,c,Ans; 8 LL mgml(LL a,LL b,LL ans=1){ 9 for(;b;b>>=1,a=a*a%mod) if(b&1) ans=ans*a%mod; 10 return ans; 11 } 12 LL C(int x,int y){ 13 if(x<y) return 0; 14 return fac[x]*inv[y]%mod*inv[x-y]%mod; 15 } 16 signed main(){ 17 fac[0]=inv[0]=inv[1]=1; 18 for(int i=1;i<=100;++i) fac[i]=fac[i-1]*i%mod; 19 for(int i=2;i<=100;++i) inv[i]

「题解」:e

眉间皱痕 提交于 2019-12-01 05:20:32
问题 B: e 时间限制: 2 Sec 内存限制: 512 MB 题面 题面谢绝公开。 题解 话说一天考两个主席树这回事…… 正解可以叫树上主席树??(脸哥说也叫主席树上树???) 对于树上的每一条链建主席树,支持链上查询前驱和后继。 对于所有的$p[i]$,他说怎么得到就按他说的做就好,然后求所有$p[i]$的$LCA$。 对于每个$p[i]$到$LCA$的链上查一次$r$的前驱和后继更新答案即可。 注意:参数不要传反、别一个特判把自己判掉、pre和nxt的代码不要粘贴,粘贴了不要忘记改掉内部递归函数…… (昨天下午大概帮3、4个人调这题代码???RP++) #include<bits/stdc++.h> #define rint register int using namespace std; const int N=100005,M=1000000000; inline void read(int &A) { A=0;int B=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')B=-1;ch=getchar();} while(ch>='0'&&ch<='9'){A=(A<<3)+(A<<1)+ch-'0';ch=getchar();} A=A*B; } int n,q,tp,ans,a[N],p[N]; int

2019 牛客国庆集训派对day1-C Distinct Substrings(exkmp+概率)

浪尽此生 提交于 2019-11-30 23:23:05
链接: https://ac.nowcoder.com/acm/contest/1099/C 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K Special Judge, 64bit IO Format: %lld 题目描述 输入描述: 输出描述: For each test case, print an integer which denotes the result. 示例1 输入 复制 3 2 1 1 2 2 3 1 2 1 1000000 1 输出 复制 18 69 317072014 备注: For the second test case, h(1) = h(2) = 2, h(3) = 3. 题目的意思是:给一串数字,然后在后面添加一个数字x问你新增了多少子串h[x],求这个数字x取从1到m时 3 x *h[x]%mod的异或和; 思路:考虑新添加一个数字,增加的子串的数量为所有以该数字结尾的后缀,但是会出现前面已经出现过的子串,所以我们需要算出在没有添加之前出现过多少以该数字结尾的字符串,考虑将这些数反过来,然后用exkmp求出,next[i]: T[i~n-1]和T的最长公共前缀;对于1~m的每一个数字,我们只要求出其最大值即可,然后n-最大值就是这个数字的答案,将所有的答案异或就是最后的答案了。

玄武密码

你。 提交于 2019-11-30 19:34:15
https://loj.ac/problem/10058 题目描述   给出一个模式串和若干匹配串,求每个匹配串在模式串中前缀的最大匹配长度。 思路   显然,题意理清楚之后这就是一道几乎是AC自动机的模板题。不过还需要稍稍改一些,首先我们已知N、M的范围,显然对于M进行匹配是不行的,不过我们考虑在一次模式串的匹配串中处理出所有信息。我们如果匹配到k位,那么nxt[k]以及nxt[nxt[k]]等都可以匹配,我们把这些点做一个标记,输出答案是统计这个标记到哪里即可。 代码 #include <bits/stdc++.h> using namespace std; const int MAXN=1e7+10; int ch[MAXN][4],tot,nxt[MAXN],ans; char ss[MAXN],s[100005][110]; bool f[MAXN]; map<char,int>mp; void clear() { memset(ch,0,sizeof(ch)); tot=1; for(int i=0;i<4;i++) ch[0][i]=1,ch[1][i]=0; } void insert(char *s) { int u=1,len=strlen(s); for(int i=0;i<len;i++) { int c=mp[s[i]]; if(!ch[u][c])ch

POJ3278 Catch that cow

这一生的挚爱 提交于 2019-11-30 18:32:21
Description 在一个数轴上开始农夫在位置N,奶牛在位置K,奶牛的位置不动,农夫每次有三种选择: 1,向左走一步,花费1秒 2,向右走一步,花费一秒 3,走到2*n的位置,花费一秒 问农夫最少花多长时间找到奶牛。 Input N和K Output 最短的时间 题解:是一道bfs的入门题,注意只有向左走一步才能往左走,注意添加if(k<n)printf("%d\n",n-k);的剪枝。 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #define maxn 1000005 7 8 using namespace std; 9 10 int step[maxn],n,k; 11 bool vis[maxn]; 12 queue <int> q; 13 14 inline void bfs(int pos) 15 { 16 step[pos]=0; 17 vis[pos]=true; 18 q.push(pos); 19 while(!q.empty()) 20 { 21 int p=q.front(); q.pop(); 22 for(register int i=1;i<=3;++i) 23 { 24 int nxt;

KMP自动机

♀尐吖头ヾ 提交于 2019-11-30 16:18:39
KMP自动机 分类:字符串 内容:详细版 前置知识 不会的可以点击链接(如果有)或者前往 OI-Wiki 学习 KMP 一些约定 字符集大小默认为 m 模板字符串默认为 s 文本字符串默认为 t |s| 指字符串 s 的长度 字符串下标默认从 1 开始 简介 KMP自动机主要用于字符串的匹配问题,预处理复杂度为 O(|s|*m) ,可以以严格 O(|t|) 的复杂度进行字符串匹配( KMP 为均摊 O(|t|) ) ,并且可以处理可持久化字符串匹配问题 。 同时 KMP 自动机也是 AC 自动机(可以处理多个模板串的匹配)的基础。 构造 KMP 自动机 KMP 自动机与 KMP 的区别在于 KMP 自动机额外求出了 \(trans_{i,j}\) 表示在第 i 位置上往后匹配一个 j 字符会转移到什么状态(状态在这里指已经成功匹配了多少个字符)。 在下文中,将用 fail 来代替 KMP 的 next , nxt 代替上面的 trans。 普通地实现 KMP 自动机 假设我们处理到了第 i 个状态并且前 i-1 个状态已经完全处理好了,当前的 fail 也指向了正确的位置。 考虑每个 nxt 指向的状态: nxt[s[i + 1]] 显然指向 i+1 。 其余的 nxt 应当指向一直跳 fail 后第一个下一个字符能匹配的位置,即: nxt[i][j] = i; while(nxt

Match & Catch CodeForces - 427D 后缀自动机水题

。_饼干妹妹 提交于 2019-11-30 06:17:32
题意: 给出两个字符串a,b,求一个字符串,这个字符串是a和b的子串, 且只在a,b中出现一次,要求输出这个字符串的最小长度。 题解: 将a串放入后缀自动机中,然后记录一下每个节点对应的子串出现的次数 然后把b串取自动机中匹配 然后判断一下 1 #include <set> 2 #include <map> 3 #include <stack> 4 #include <queue> 5 #include <cmath> 6 #include <ctime> 7 #include <cstdio> 8 #include <string> 9 #include <vector> 10 #include <cstring> 11 #include <iostream> 12 #include <algorithm> 13 #include <unordered_map> 14 15 #define pi acos(-1.0) 16 #define eps 1e-9 17 #define fi first 18 #define se second 19 #define rtl rt<<1 20 #define rtr rt<<1|1 21 #define bug printf("******\n") 22 #define mem(a, b) memset(a,b,sizeof(a)) 23

不在B中的A的子串数量 HDU - 4416 (后缀自动机模板题目)

蹲街弑〆低调 提交于 2019-11-30 05:35:25
题目: 给定一个字符串a,又给定一系列b字符串,求字符串a的子串不在b中出现的个数。 题解: 先将所有的查询串放入后缀自动机(每次将sam.last=1)(算出所有子串个数) 然后将母串放入后缀自动机然后记录这个子串个数 两个值相减即可 1 #include <set> 2 #include <map> 3 #include <stack> 4 #include <queue> 5 #include <cmath> 6 #include <ctime> 7 #include <cstdio> 8 #include <string> 9 #include <vector> 10 #include <cstring> 11 #include <iostream> 12 #include <algorithm> 13 #include <unordered_map> 14 15 #define pi acos(-1.0) 16 #define eps 1e-9 17 #define fi first 18 #define se second 19 #define rtl rt<<1 20 #define rtr rt<<1|1 21 #define bug printf("******\n") 22 #define mem(a, b) memset(a,b,sizeof(a)) 23

多个串的最长公共子串 SPOJ - LCS2 后缀自动机

∥☆過路亽.° 提交于 2019-11-30 02:01:31
题意: 求多个串的最长公共子串 这里用的是O(n)的后缀自动机写法 我后缀数组的专题有nlog(n)写法的 题解: 对于其中的一个串建立后缀自动机 然后对于后缀自动机上面的每一个节点求出每一个节点最长可以匹配的子串(用maxx【】数组存下) 但是在后缀自动机上面有些节点没有走过,但是是某些走过的点的父亲节点因此也是有值的 for (int i = tot; i; i--) maxx[fail[i]] = max(maxx[fail[i]], min(len[fail[i]], maxx[i]));然后求一个所有最小值里面的最大值就好了 1 #include <set> 2 #include <map> 3 #include <stack> 4 #include <queue> 5 #include <cmath> 6 #include <ctime> 7 #include <cstdio> 8 #include <string> 9 #include <vector> 10 #include <cstring> 11 #include <iostream> 12 #include <algorithm> 13 #include <unordered_map> 14 15 #define pi acos(-1.0) 16 #define eps 1e-9 17 #define fi

BZOJ 3747: [POI2015]Kinoman

别等时光非礼了梦想. 提交于 2019-11-29 14:24:08
题意: https://www.lydsy.com/JudgeOnline/problem.php?id=3747 有 m 个不同颜色 的点, 每个点有个权值 ,现在由这 m 种颜色的点组成的 长度为 n 的序列 求一个区间,这个区间内 只出现一次的点 的权值和最大 参考博客: http://hzwer.com/5715.html 分析 这种 和颜色出现次数相关的题 比较正常的想法就是 枚举左端点 , 在 右移左端点 的时候,处理“右移”这个操作 对[l, nxt[l]-1] 以及 [nxt[l] , n] 这两个区间 中答案的的影响。 注意可能有颜色不在序列中的情况 这题数据要开longlong #include<cstdio> #include<algorithm> using namespace std; #define ll long long const int MAX = 1000000+99; int n,m; ll ans; int nxt[MAX], lst[MAX]; int f[MAX], w[MAX]; struct tree{ ll add, mx; }tr[MAX<<2]; void pushup(int o) {tr[o].mx = max(tr[o<<1].mx, tr[o<<1|1].mx);} //void build(){} void