nxt

NOI2018 你的名字――SAM+线段树合并

匿名 (未验证) 提交于 2019-12-02 23:43:01
题目链接在这里 洛谷 / LOJ 有一个串 \(S\) ,每次询问给你一个串 \(T\) ,两个数 \(L\) 和 \(R\) ,问你 \(T\) 有多少个本质不同的子串不是 \(S[L,R]\) 的子串 SOLUTION 如果你做过 生成魔咒 和 CF1037H ,就会做这道题了 有两个坑点: 1.线段树合并时必须每次都新建结点,因为两颗树都得保留 2.每次失配时必须先尝试减小已经匹配的长度,无法继续减少时再跳 \(suflink\) 我的大常数代码 #include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <random> #include <string> #include <vector> #include <cmath> #include <ctime> #include <queue> #include <map> #include <set> #define IINF 0x3f3f3f3f3f3f3f3fLL #define u64 unsigned long long #define pii pair<int, int> #define mii map<int, int> #define u32 unsigned

Codeforces-17C Balance

拟墨画扇 提交于 2019-12-02 19:59:08
题目大意:   给定一个长度为n的只含有a,b,c的字符串,对该字符串进行多次(或0次)以下操作:将某个位置的字符变为其左边的或右边的。求操作后所得字符串满足3种字符两两数量差不超过1的有多少个?   n<=150 题目解法:   观察原始字符串A和变化字符串B的关系。   可以发现(赫赫 窝就无法发现)若我们将A和B均进行去重操作分别得到A' B',那么B'一定是A'的子串。它的正确性也是比较显然的(emm某个字符若想跑到前面的字符前面那么一定会将前面的字符覆盖(((   那么我们就可以将原串直接去重得到S,然后我们只需要一位一位生成新串与原串匹配即可。f[i][a][b][c]表示匹配到原串的第i位,有a个'a',b个'b',c个'c'的字符串个数,根据下一位字符的三种选择,它可以向后转移到f[nxt[i]['a']][a+1][b][c], f[nxt[i]['b'][a][b+1][c], f[nxt[i]['c'][a][b][c+1]。其中nxt数组时需要预处理,表示第i位后第一个a/b/c的位置。因为ab和abbb去重后相同显然是可以匹配到相同位置的,因此这里的nxt定义中的下一个包含其本身。   答案统计只需要在计算过程中将满足a+b+c==n且差值不大于1的f值累加起来即可。看似是O(n^4)的复杂度,实际上后面三维大概在n/3的大小

C# library for Lego Mindstorm NXT [closed]

♀尐吖头ヾ 提交于 2019-12-02 16:19:24
Is there C# (.NET) library for Lego Mindstorm NXT, which is up-to-date? NXT.NET for LEGO Mindstorms last update 18.04.2008 http://nxtnet.codeplex.com/ MindSqualls last update 05.06.2007 http://www.mindsqualls.net/ Lego .NET last update 07.04.2005 http://www.dcl.hpi.uni-potsdam.de/research/lego.NET/weblog/ I know, there is MS Robotic studio, but my question is not about that. As far as I can tell, There is no source code available for NXT.NET for LEGO Mindstorms despite the project being hosted on codeplex. The library is not really complete yet - and it would seem that development has stalled.

TCP输入 之 tcp_rcv_established

馋奶兔 提交于 2019-12-02 15:39:38
概述 tcp_rcv_established用于处理已连接状态下的输入,处理过程根据首部预测字段分为快速路径和慢速路径; 1. 在快路中,对是有有数据负荷进行不同处理: (1) 若无数据,则处理输入ack,释放该skb,检查是否有数据发送,有则发送; (2) 若有数据,检查是否当前处理进程上下文,并且是期望读取的数据,若是则将数据复制到用户空间,若不满足直接复制到用户空间的情况,或者复制失败,则需要将数据段加入到接收队列中,加入方式包括合并到已有数据段,或者加入队列尾部,并唤醒用户进程通知有数据可读; 2. 在慢路中,会进行更详细的校验,然后处理ack,处理紧急数据,接收数据段,其中数据段可能包含乱序的情况,最后进行是否有数据和ack的发送检查; 源码分析 1 he first three cases are guaranteed by proper pred_flags setting, 2 * the rest is checked inline. Fast processing is turned on in 3 * tcp_data_queue when everything is OK. 4 */ 5 void tcp_rcv_established(struct sock *sk, struct sk_buff *skb, 6 const struct tcphdr

P2414 [NOI2011]阿狸的打字机

六眼飞鱼酱① 提交于 2019-12-02 12:08:24
题意: 打字机上只有28个按键,分别印有26个小写英文字母和’B’、'P’两个字母。经阿狸研究发现,这个打字机是这样工作的: ·输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的最后)。 ·按一下印有’B’的按键,打字机凹槽中最后一个字母会消失。 ·按一下印有’P’的按键,打字机会在纸上打印出凹槽中现有的所有字母并换行,但凹槽中的字母不会消失。 例如,阿狸输入aPaPBbP,纸上被打印的字符如下: a aa ab 我们把纸上打印出来的字符串从1开始顺序编号,一直到n。打字机有一个非常有趣的功能,在打字机中暗藏一个带数字的小键盘,在小键盘上输入两个数(x,y)(其中1≤x,y≤n),打字机会显示第x个打印的字符串在第y个打印的字符串中出现了多少次。 题解: 字符串总长1e5,如果我们在线做法,肯定会T到爆炸,因为每次询问都需要插入重建fail图,所以我们选择离线处理,把所有查询y中有多少个x的询问一起查询,即查询y中有多少个x1,x2,xn…,把所有操作形成的字符串全部放进去,但这样显然还是会超时,怎么办? 仔细想想,y中有多少个x,不就是求y的某个节点往上跳fail能不能到达x,因为每个节点的fail一定最多只有一条,所有我们完全可以反向建边,建出fail树,那么我们的问题不就是求x往下能到达多少个y的节点,那这就不是相当于求子树和了吗? 再想想

【Codeforces】Orz Panda Cup

你离开我真会死。 提交于 2019-12-02 08:49:17
大大出的题 大大经常吐槽没有人补,所以我决定做一个康康 A. APA of Orz Pandas 题意:给你一个包含+-*/%和()的表达式,让你把它转化成java里BigInteger的形式 大概就像这样 "a.add(b).remainder(M).multiply(d.substract(e.multiply(f)).add(g.divide(h))).multiply (BigInteger.ValueOf(233)) ... ..." 有意思的模拟题,不是很好写 首先要看清题,a+(b+c)应该输出为a.add(b.add(c))而不是a.add(b).add(c) 我之前看错题,使得这个题难度高了一点,但是那样也可以做,只需预处理无用括号即可 观察可以发现,不存在(a.add(b)).add(c)这种说法,也就是说,括号的本质作用是改变运算顺序,然后把括号里的表达式作为一个对象参与运算 那么就可以把括号里的东西看成一个变量,然后问题就转化为没有括号的表达式的处理 对于括号中的括号,可以把输出写成参数l和r的函数,功能为输出下标为[l,r]的子区间,然后递归处理 接下来的问题是找到输出序列中括号的包含范围,例如a+b*c要表示为a.add(b.multiply(c)),如何找到add右括号的位置 可以开一个栈 左括号可以直接压入 当压入右括号时

poj3694 Network[边双缩点+树剖/并查集]

大憨熊 提交于 2019-12-02 07:49:26
首先同一个点双内部的加边肯定不影响。。所以先缩点成树,然后每次加一条边,这条对应的树上路径上所有边就都不是桥了,且每次操作独立作用,不相互影响(不过有可能本来一条边已经不是桥了又被标记了一次),所以每次相当对树链做一次链覆盖,统计未覆盖边。这个是链剖板子。。$O(N\log^2N)$ 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #define mst(x) memset(x,0,sizeof x) 8 #define dbg(x) cerr << #x << " = " << x <<endl 9 #define dbg2(x,y) cerr<< #x <<" = "<< x <<" "<< #y <<" = "<< y <<endl 10 using namespace std; 11 typedef long long ll; 12 typedef double db; 13 typedef pair<int,int> pii; 14 template<typename T>inline T _min(T A,T B){return A<B?A:B;} 15 template

模拟测试20191023

牧云@^-^@ 提交于 2019-12-02 03:31:22
$morning$ T1:最大异或和 设$sum$=$a_{1}$^$a_{2}$^......^$a_{n}$, 转化题意,相当于小T初始权值为sum,小Q初始权值为0,可以选不相连的点两个人同时异或这个点的权值 从高到低sum二进制下某一位,如果是0,那么小Q和小T在这一位上一定相等 如果是1,那么必须选一个这一位上是1的点小Q才能大于小T 而如果sum这一位是1,那么至少一个点这一位上是1 则题意转化为如果sum>0,则输出Q,反之输出T T2:简单的括号序列 设pre_{i}表示i即之前(的个数,nxt[i]表示i之后)的个数 很容易得到O(n^{2})的柿子: $$\sum_{s[i]=='('}\sum_{j=1}^{pre[i-1]}{pre[i-1]\choose j }\times {nxt[i]\choose j+1}$$ 稍化一下 $$\sum_{s[i]=='('}\sum_{j=1}^{pre[i-1]}{pre[i-1]\choose j }\times {nxt[i]\choose j+1}$$ $$=\sum_{s[i]=='('}\sum_{j=1}^{pre[i-1]}{pre[i-1]\choose j }\times {nxt[i]\choose nxt[i]-j-1}$$ $$=\sum_{s[i]=='('} {nxt[i]+pre[i

种树 反悔操作 【贪心】

此生再无相见时 提交于 2019-12-02 02:56:13
本人水平有限,题解不到为处,请多多谅解 本蒟蒻谢谢大家观看 题目 : 传送门 具体的解析大佬博客里有 推荐 : 博客 我这里是来讲下如何代码实现的 我们用pair来实现堆优化 ,first代表权值,second代表权值位置 1 void del(int x){ 2 pre[nxt[x]]=pre[x]; 3 nxt[pre[x]]=nxt[x]; 4 flag[x]=true; 5 } 以上代码如何理解呢? 先看一幅图: 我们先算4个点 如果依照 最基本的贪心策略 (即 取最大值 ) 应该是这样: 但是我们发现这并不是最优解, ans==10,明显小于 ans==16 这时就要进行 反悔操作 ,即赎买 ,算差值 记录我们取的 当前节点的最大值与其左右两个节点之和的差值 (来 方便赎买) 即反悔操作 可知: 差值为7 (8+8-9=7) 这时我们把 7放到原先9的位置上 我们发现 8在我们取9的时候被打上了标记,不能取 即: 1 flag[x]=true; 对于 不能取的点,我们要让其退出堆 内,即: 1 while (flag[Q.top().second]){ 2 Q.pop(); 3 } 这时堆里的最大值为7,就取出7来更新ans 1 pre[nxt[x]]=pre[x]; 2 nxt[pre[x]]=nxt[x]; 所以这两句话的意思是: 如果当m的两倍大于n的话

Luogu_P3435 [POI2006]OKR-Periods of Words KMP

痞子三分冷 提交于 2019-12-02 01:42:39
Luogu_P3435 [POI2006]OKR-Periods of Words ### KMP 题目链接 阅读理解 其实就是B是A的前缀 那么叠加B成为BB,假如A是BB的前缀那么B就是合法 问A的所有合法前缀的和 emmm感性理解吧 那么读懂题面也就可以解决了 KMP的 \(nxt[]\) 数组就是自我匹配的位置 而且 \(nxt[]\) 是可以递推,假如 \(nxt\) 都不为 \(0\) \(nxt[x]\) 和 \(nxt[nxt[x]]\) 的末尾都是x这个数 为了求最长,就让 \(nxt[i]\) 最短,让 \(nxt[x]=nxt[nxt[x]]\) 那么 \(i-nxt[i]\) 就是最长的长度 求和就可以了 代码如下: #include<bits/stdc++.h> using namespace std; int n,nxt[1000010]; long long ans; char s[1000010]; int main() { cin>>n>>(s+1); for(int i=2,j=0;i<=n;i++){ while(j && s[i]!=s[j+1]) j=nxt[j]; if(s[i]==s[j+1]) j++; nxt[i]=j; } for(int i=2,j=2;i<=n;i++,j=i){ while(nxt[j]) j=nxt[j];