nxt

Explicitly set docstring of a method

我的未来我决定 提交于 2021-02-07 12:32:56
问题 I help to maintain a package for python called nxt-python. It uses metaclasses to define the methods of a control object. Here's the method that defines the available functions: class _Meta(type): 'Metaclass which adds one method for each telegram opcode' def __init__(cls, name, bases, dict): super(_Meta, cls).__init__(name, bases, dict) for opcode in OPCODES: poll_func, parse_func = OPCODES[opcode] m = _make_poller(opcode, poll_func, parse_func) setattr(cls, poll_func.__name__, m) I want to

KMP,Trie,AC自动机题目集

放肆的年华 提交于 2020-04-06 08:47:44
字符串算法并不多,KMP,trie,AC自动机就是其中几个最经典的。字符串的题目灵活多变也有许多套路,需要多做题才能体会。这里收集了许多前辈的题目做个集合,方便自己回忆。 KMP题目: https://blog.csdn.net/qq_38891827/article/details/80501506 Trie树题目: https://blog.csdn.net/qq_38891827/article/details/80532462 AC自动机:模板 https://www.luogu.org/blog/42196/qiang-shi-tu-xie-ac-zi-dong-ji AC自动机题目集: https://www.cnblogs.com/kuangbin/p/3164106.html KMP: LuoguP3375 KMP模板 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=1000000+10; char a[N],b[N]; int n,m,nxt[N],f[N],g[N]; void get_next() { nxt[1]=0; for (int i=2,j=0;i<=n;i++) { while (j>0 && a[j+1]!=a[i]) j

Codeforces Round #627 (Div. 3)题解 cf 1324A 1324B 1324C 1324D 1324E 1324F

微笑、不失礼 提交于 2020-03-13 05:12:21
https://codeforces.com/contest/1324 A. Yet Another Tetris Problem n列的俄罗斯方块画面,现在第 \(i\) 列已经有 \(a_i\) 块方块了,问能不能用若干个一列两行的方块把所有方块Sakuzyo。 判所有数字奇偶性是否相同就行,有手就能过 #include <bits/stdc++.h> #define LL long long #define pb push_back #define eb emplace_back #define pii pair<int,int> #define pll pair<LL,LL> using namespace std; int T, n, a[108]; bool gao() { for (int i = 1; i <= n; ++i) { if (a[i] % 2 != a[1] % 2) return false; } return true; } int main() { cin >> T; while (T--) { cin >> n; for (int i = 1; i <= n; ++i) cin >> a[i]; cout << (gao()? "YES":"NO") << endl; } } B. Yet Another 有手就行 Palindrome

光:模拟,桶

你。 提交于 2020-03-12 17:10:49
谁说我做不出来大模拟题的? 大码量警告:我4.2k,skyh 3.6k,tdcp 4.9k.orz mikufun 2.7k 其实绝大多数部分都是在复制粘贴。 首先,60分暴力不讲可以的嘛?纯粹模拟诶。 1 #include<cstdio> 2 int n,m,x,nx,ny,ndir,ans,bl[1005][1005],al[1005][1005][4],ne[200005],sw[200005];//0NE 1SE 2SW 3Nw 3 const int tox[4]={1,1,-1,-1},toy[4]={-1,1,1,-1},c1[4]={3,2,1,0},c2[4]={1,0,3,2}; 4 char s[3]; 5 int main(){ 6 scanf("%d%d%d",&n,&m,&x); 7 for(int i=1,a,b;i<=x;++i)scanf("%d%d",&a,&b),bl[a][b]=1; 8 for(int i=0;i<=n+1;++i)bl[i][0]=bl[i][m+1]=1; 9 for(int i=0;i<=m+1;++i)bl[n+1][i]=bl[0][i]=1; 10 scanf("%d%d%s",&nx,&ny,s); 11 if(s[0]=='S'&&s[1]=='E')ndir=1; 12 if(s[0]=='S'&&s[1]

「SDOI2010」猪国杀:模拟

怎甘沉沦 提交于 2020-02-16 09:14:29
$Description:$ 游戏背景 《猪国杀》是一种多猪牌类回合制游戏,一共有 种角色:主猪,忠猪,反猪。每局游戏主猪有且只有 只,忠猪和反猪可以有多只,每只猪扮演 种角色。 游戏目的 主猪 /MP:自己存活的情况下消灭所有的反猪。 忠猪 /ZP:不惜一切保护主猪,胜利条件与主猪相同。 反猪 /FP:杀死主猪。 游戏过程 游戏开始时,每个玩家手里都会有 张牌,且体力上限和初始体力都是 。 开始游戏时,从主猪开始,按照逆时针方向(数据中就是按照编号从 的顺序)依次行动。 每个玩家自己的回合可以分为 2 个阶段: 摸牌阶段:从牌堆顶部摸 张牌,依次放到手牌的最右边; 出牌阶段:你可以使用任意张牌,每次使用牌的时候都使用最靠左的能够使用的牌。当然,要满足如下规则: 如果没有猪哥连弩,每个出牌阶段只能使用 次「杀」来攻击; 任何牌被使用后被弃置(武器是装备上);被弃置的牌以后都不能再用,即与游戏无关。 各种牌介绍 每张手牌用 个字母表示,字母代表牌的种类。 基本牌 『桃 /P』在自己的回合内,如果自己的体力值不等于体力上限,那么使用 个桃可以为自己补充 点体力,否则不能使用桃;桃只能对自己使用;在自己的回合外,如果自己的血变为 或者更低,那么也可以使用。 『杀 /K』在自己的回合内,对攻击范围内除自己以外的 名角色使用。如果没有被『闪』抵消,则造成 点伤害。无论有无武器

二叉堆

痴心易碎 提交于 2020-02-07 01:36:04
二叉堆 二叉堆是一种基础数据结构,二叉堆的操作内容包括插入,删除,查询等。 性质: 堆是一颗完全二叉树,堆的顶端一定是“最大”,最小”的,但是要注意一个点,这里的大和小并不是传统意义下的大和小,它是相对于优先级而言的。 堆有两种模式,小根堆和大根堆,分别对应第二个性质中的“堆顶最大”“堆顶最小”,对于大根堆而言,任何一个非根节点,它的优先级都小于堆顶,对于小根堆而言,任何一个非根节点,它的优先级都大于堆顶。 然而二叉堆的代码实现也有两种,包括手写堆和STL; 首先我们通过手写堆来实现对堆的理解。 1.插入 void swap ( int & x , int & y ) { int t = x ; //交换函数 x = y ; y = t ; } int heap [ N ] ; //定义一个数组来存堆 int siz ; //堆的大小 void push ( int x ) //要插入的数 { heap [ ++ siz ] = x ; now = siz ; //插入到堆底 while ( now ) //还没到根节点,还能交换 { ll nxt = now >> 1 ; //找到它的父亲 if ( heap [ nxt ] > heap [ now ] ) swap ( heap [ nxt ] , heap [ now ] ) ; //父亲比它大,那就交换 else

二叉堆的插入与删除

廉价感情. 提交于 2020-02-07 00:10:17
一. 堆的介绍 1.堆是一棵完全二叉树 2.一般来说,堆顶一般来说是最大或最小的,这里的最大最小是指优先级,并非传统意义的大小 3.堆一般有俩种形式,大根堆和小根堆,大根堆是堆顶的优先级最大,小根堆就是堆顶的优先级最小 二.堆的操作 一. 插入 堆的插入就是把新的元素放到堆底,然后去判断是否符合这个位置的要求,如果符合就丢在那里了,如果不符合,那就和它的父亲交换一下,用递归,直到符合,那么插入就算完成了 void swap ( int & x , int & y ) //交换函数 { int t = x ; x = y ; y = t ; } int heap [ N ] ; //定义一个数组来存堆 int siz ; //堆的大小 void push ( int x ) //要插入的数 { heap [ ++ siz ] = x ; now = siz ; //插入到堆底 while ( now ) { //还没到根节点,还能交换 long long nxt = now >> 1 ; //找到它的父亲 if ( heap [ nxt ] > heap [ now ] ) swap ( heap [ nxt ] , heap [ now ] ) ; //父亲比它大,那就交换 else break ; //如果比它父亲小,那就代表着插入完成了 now = nxt ; //交换 }

[HNOI2019]JOJO

会有一股神秘感。 提交于 2020-02-06 04:21:45
[HNOI2019]JOJO [题目链接] 链接 [思路要点] 题目询问的是当前字符串做 \(\text{kmp}\) 之后的 \(\text{nxt}\) 数组的值的和 首先考虑没有第二种操作的情况 将添加操作看成添加一个字符,这个字符有两个属性,长度和字符。 不难发现,两个子串相匹配,每个子串拆分成开头某一段的后缀 + 中间一堆完整的段 + 结尾某一段的前缀,而题目中一定是某个前缀和某个后缀相匹配,也就是第一个串的开头是完整的段,最后一个串的结尾是完整的段,最后一个串的开头所在段比第一个串可能长,最后一个串结尾所在段比第一个串可能短 由于中间部分完全匹配,所以直接做普通的 \(\text{kmp}\) 即可,开头由于没有修改,直接令全文的第一段能够匹配所有字符和它一样但长度大于等于它的段就处理好了,关键在于结尾串的处理 考虑 \(\text{kmp}\) 的实现过程,实质上是不断跳 \(nxt\) 的过程,由于题目保证每次加入的字符不和之前最后一个字符相同,那么 \(nxt\) 跳在某一段中间时是不可能匹配的,可以减少一些情况。不妨设最后一段的字符是 c ,现在跳到 \(nxt\) 有三处紧跟的字符都是 c ,第一处为 (p1,c,l1) ,第二处为 (p2,c,l2) ,第三处为 (p3,c,l3) ,其中 p 表示 \(nxt\) 的值,也就是跳到的位置, l 表示这一段

P3466 [POI2008]KLO-Building blocks(Splay)

喜夏-厌秋 提交于 2020-02-05 09:40:43
题意: N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次数的动作完成任务.你还要求输出结束状态时,每柱砖的高度 题解: 很显然,要让我们将这K个柱子变成一样高并且操作次数最少,就是求这K个数的中位数 所以我们需要用一种数据结构能够实现插入,删除,求第k大,它前面有多少个数,后面有多少个数。 然后根据这K个数和中位数就能计算出最少次数了 a n s = m i n ( ∑ i = l r ∣ a i − x ∣ ) ans = min(\sum_{i=l}^{r}|a_i-x|) a n s = m i n ( i = l ∑ r ​ ∣ a i ​ − x ∣ ) 找到中位数后就可以知道 a n s = m i n ( ∑ i = l m i d x − a i + ∑ i = m i d + 1 r a i − x ) ans = min(\sum_{i=l}^{mid}x-a_i+\sum_{i=mid+1}^{r}a_i-x) a n s = m i n ( i = l ∑ m i d ​ x − a i ​ + i = m i d + 1 ∑ r ​ a i ​ − x ) 左边可以通过将中位数伸展到根节点,然后求出比该数小的和及比它大的数的和即可

Codeforces Round #366 (Div. 1) B

心已入冬 提交于 2020-02-03 22:26:27
题意 规定起点、终点。 遍历所有点,从一点向左向右跳到某个点的贡献不同。并且一个点只能访问有且只有一次。 题解 做法一: d p dp d p 我们可以规定每个点的入边、出边,可以发现转移式子。 但是苦于不理解起点终点的特殊情况。暂不提供题解。 做法二:贪心 起点到终点 s t o e s\quad to\quad e s t o e 往里面一个一个插入点,每次插入的时候把旧的贡献去掉加上新的贡献。 然后找到最佳位置。 这是可撤销的贪心,所以正确。 写个链表即可。 # include <bits/stdc++.h> # define FOR(i,l,r) for(int i=l;i<=r;i++) # define sf(x) scanf("%d",&x) using namespace std ; typedef long long ll ; const int maxn = 350050 ; int x [ maxn ] , a [ maxn ] , b [ maxn ] , c [ maxn ] , d [ maxn ] ; int nxt [ 5050 ] ; ll dist ( int i , int j ) { if ( i > j ) return abs ( x [ i ] - x [ j ] ) + 1ll * c [ i ] + 1ll * b [ j ] ;