思路:f[i]表示从1-i字符串s是否可以拆分,那么可以得出如果f[i]可以拆分时,我们枚举i+1——n组成的字符串中有没有出现再字典里的如果i+1——j构成的字符串出现过则说明,f[j]可以拆分。我们手写一个字符串hash表,原理是将将字符串变成一个P进制数 代码: class Solution { public:
题意 求 16 16 16 进制下, n ! n! n! 去掉尾部
#include <iostream>#include <stdio.h>using namespace std;typedef unsigned long long ULL;const int N=100010,P=131;int n,m;char str[N];ULL h[N],p[N];ULL get(int l,int r){ return h[r]-h[l-1]*p[r-l+1];}int main(){ scanf("%d%d%s",&n,&
\[\color{red}{\text{校长者,真神人也,左马桶,右永神,会执利笔破邪炁,何人当之?}} \\ \begin{array}{|} \hline \color{pink}{\text{The principal is really a god}} \\ \color{pink}{\text{with a closestool on the left and Yongshen on the right}} \\ \color{pink}{\text{holdi
题目 给定正整数 \(n\),求 \(n!\) 在 16 进制下去掉末尾的 0 之后的末 16 位。 对于 \(100\%\) 的数据,满足 \(1\le n<2^{64}\)。 分析 设 \(\bold{v}_p(x)\) 表示 \(x\) 中含因子 \(p\) 的个数。 首先考虑直接计算 \(\frac{n!}{2^{\bold{v}_2(n!)}}\);在此之后,由于答案在 16 进制下
学习目标: 1.每日一道代码题 2.大学物理题目三道 3.英语翻译与作文描写 学习内容: 1.HDU2046 #include <stdio.h> #define MAXN 50 typedef unsigned long long ULL; ULL fn[MAXN+1]; void setfn() { int i; fn[0] = 0; fn[1] = 1; fn[2] = 2; for
求一个字符串由多少个重复的子串连接而成 先搞hash就好 const int N = 1e6 + 79; char s[N]; int n; char ch; ull h[N], base = 131, hash[N]; inline ull H(int l, int r) { return hash[r] - hash[l - 1] * h[r-l+1]; } inline bool check(int len,ull num){ for(int l=1;l
传送门 暴力水过去了…… 有一个AC自动机上的解法 考场上想的是将 \(s\) 都扔到AC自动机上,设法用 \(t\) 去匹配但不太可做 发现 \(s\) 的后缀若是 \(t\) 的前缀,那从 \(s\) 不断跳fail指针能跳到 \(t\) 中的节点上 于是有想法是将询问离线,对每个 \(s\) 都跳一遍fail,但是会T 所以可
考试经过 开场T1发现状压dp,写了2h和暴力拍上了,觉得比较稳 T2直接模拟的,T3开始以为二分后来假了,于是暴力匹配+玄学记忆化+剪枝,不知道有多少分 T4很不可做的样子,于是暴力+测试点分治走人了 然而T1挂了,20+47+100+20=187,直接转移给最大值是不对的,样例太水了。。 T1 出了个大阴间题 分
Description 给定 \(N,k\),求: \[\sum_{i=1}^N\sum_{j=1}^N (f(\gcd(i,j)))^k \]其中 \(f(x)\) 表示 \(x\) 质因子分解结果中次大的质因子,重复的质因数计算多次。 Constraints \(1\le N,k\le 2\cdot 10^9\) Solution 记 \(f_k(x)=(f(x))^k\)。推式子: \[\begin{aligned} \sum_{i}^N\s
题意:维护数列,四种操作 查询x的lower_bound 删去x的lower_bound 查询小于等于x的sum 恢复所有小于等于x的2操作 权值线段树维护,需要记录区间最大值和sum; 对于操作1和2,线段树二分 操作3直接查询区间和 操作4考虑均摊,把所有2操作放到priority_queue里,暴力插回去即可 复杂度\(O(n\lo
T1 三元组 解题思路 一看题面,好像是一道数学题,但不完全是,或者说根本不是。。。 比较好想到的是 \(\mathcal{O}(n^2)\) 和 \(\mathcal{O}(nk)\) 的做法,然后就有了 60pts。。。 观察范围对于每一个 \(b\) 而言 \(a+b^2\) 的范围就是 \([1+b^2,b+b^2]\) 。 充分利用 \(a\le b\le c\)
考虑处理出最大的m+1种方案,这些方案中一定有答案。 以m个冲突的方案为基础进行修改,若全取最大为不合法方案,则由某一个方案修改一个装备可以取到最优答案(会传递下去) 对于某个方案,我们可以尝试遍历它的所有位置,尝试把某个位置上的装备改为仅次于当前装备的装备。\(O(mn)\) 写+调得
正题 题目链接:https://www.luogu.com.cn/problem/P3706 题目大意 给出 \(n\) 个长度为 \(m\) 的 \(H/T\) 串。 开始一个空序列,每次随机在后面加一个 \(H/T\) ,求每个串第一次出现的概率。 \(1\leq n,m\leq 300\) 解题思路 数据范围显然不能在AC自动机上高斯消元,所以得考虑别的方
Description 给定小写字母组成的字符串 \(S\)。定义 \(AB\) 表示字符串 \(A, B\) 拼接,\(A^n=A^{n-1}A\) 表示 \(A\) 复制 \(n\) 遍。求三元组 \((A, B, C)\) 的个数,满足 \(S\) 可以写成 \((AB)^i C\) 的形式。共 \(T\) 组数据。 Constraints \(1\le |S| \le 2^{20}, 1\le T\le 5\)
有型的东西终究会消逝,不过……终于,这份回忆还是永远不朽的… 前言 这次考试暴露出来了不少问题。 比如答题策略策略不当导致 T2 的 65pts 暴力根本没有打。 知识遗忘太快不牢固,T4 是之前的一道回滚莫队板子题,我却早已忘光。 实在需调整。 T1 打表 解题思路 一个规律题,但是题面
干燥的冷气,尘埃的味道,我在其中……踏上旅途。 解题思路 其实仔细观察我们可以发现路径一定是一个类似于下图的一个左括号之后中间随便反复曲折,然后右边在来一个右括号。 然后对于两个括号形状的东西其实是可以利用 Hash 来判等特殊处理的。 对于中间的部分直接 DP : \(f_{i,j,k,
传送门 又是神仙DP 发现如果只有两个串就很好做了 于是这个神仙DP定义就从这里下手:令 $dp[p][c][l][r] 表示在 \([s_l, s_r]\) 这段字符串中,考虑从第 \(p\) 个位置开始的后缀,并要求这个字符至少为 \(c\) 考虑转移,因为这里有个「至少」,第一个转移是直接从 \(dp[p][c+1][l][r]\) 继
传送门 首先证一个结论:t集合即是原串的boarder不用证了吧 于是转化题意:要构造一个boarder集合确定的01串 考虑从小的boarder推向大的boarder,令小boarder为s,大boarder为t \(|s|*2 \leqslant |t|\) 此时在s后面补上s的一段后缀即可 \(|s|*2 > |t|\) 把原串复制一遍接在最后,其它位置
T1:random 我又来白剽博客了: 详细证明请看土哥 土哥写的不是很详细,我在这里详细写一下: 首先,对于f[n]的式子: 加一是那一个对的贡献,大C是选其余的几个数,\(2^{N}\)是总的子集个数。 逆序对的期望个数是: 首先,所有数字两两匹配,共有\(n*(n-1)\)对,,然后,某个对
传送门 考试的时候只来得及糊了个\(n^4\)的暴力,结果考完发现\(n^2\)比\(n^4\)还好写 题意就是就是要求把一堆字符串的前后缀拼起来之后在原串中出现了多少次 然而前后缀可以有很多,再枚举组合就炸没了 先考虑\(n^2\) 写法: 可以先预处理出所有前后缀,分别扔到map里 枚举原串中的每一
题目链接 题目大意 对数组又2种操作 1、区间整体赋值 2、询问[l,r]是否有长度为d的循环节 题目思路 其实就是一个结论 如果s[l,r-d]==s[l+d,r],那么就有长度为d的循环节,自己画图演示即可发现 然后线段树维护hash即可 代码 #include<bits/stdc++.h> using namespace std; typedef l
回文子串的最大长度 技巧 在每两个字符中插入一个新的字符,可以不用判断字符串的奇偶,方便编程。 利用字符串哈希和二分求解 #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N = 2000010; const int P = 131; typedef unsigned lon
作用 有时候 more niubi than kmp 比较两个区间的字符串是否一致就可以用 原理 将一个字符串看成一个P进制的数 对比时取子串可以直接相减得出 注意点: 1. 任意字符不可以映射成0,否则会出现不同的字符串都映射成0的情况,比如A,AA,AAA皆为0 2. 冲突问题:通过巧妙设置P (131 或 133
AcWing 841. 字符串哈希 #include <iostream> using namespace std; typedef unsigned long long ULL; const int P = 131, N = 100010; ULL h[N], p[N]; char str[N]; ULL get(int l,int r) { return h[r] - h[l-1]*p[r - l + 1]; } int main(void) { p[0] = 1