mx

Manacher(马拉车)————O(n)回文子串

可紊 提交于 2020-03-22 07:20:29
Manacher 一、背景 1975年,Manacher发明了Manacher算法(中文名:马拉车算法),是一个可以在 O(n)的复杂度 中返回字符串s中 最长回文子串长度 的算法,十分巧妙。 让我们举个栗子,栗子: 1.字符串:abbababa 最长回文子串:5(abb ababa ) 2.字符串:abcbbabbc 最长回文子串:7(ab cbbabbc ) 3.字符串:abccbaba 最长回文子串:6( abccba ba) 传统方法是,遍历每个字符,以该字符为中心向两边查找。时间复杂度为 O(n^2) ,效率很差; 而这个神奇的Manacher算法将复杂度提升到了 O(n)。 来一起瞅一瞅它是如何工作的吧。 二、算法过程分析 回文分为奇回文(ababa)和偶回文(abba),这里比较难以处理,我们使用一个 小 (sao) 技 (cao) 巧 (zuo) ( 很重要 )。我们将字符串首尾和每个字符间插入一个字符( 注意 :这个自符在串中并未出现)例如:'#'. 栗子!栗子! s='abbadcacda'先转化成s_new='$#a#b#b#a#d#c#a#c#d#a#\0'('$'与'\0',是边界,下面的代码中可以看到) 这样原串中的偶回文(abba)与奇回文(adcacda),变成了(#a#d#d#a#)与(#a#d#c#a#c#d#a#)两个 奇回文 。 定义数组p[

CodeForces 733F Drivers Dissatisfaction

痞子三分冷 提交于 2020-03-08 07:27:08
最小生成树变形,倍增。 每条边有权值$1$和权值$2$,要求构造最小生成树,有一条边可以选择权值$2$,其余边选择权值$1$。 先对权值$1$求最小生成树,然后枚举每一条边用权值$2$去替换树中的边即可。 寻找树上某条连权值最大的边,带修改的可以采用树链剖分;无修改的可以将树有根化,然后计算两点到公共祖先之间的权值最大的边,倍增预处理即可。 #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<ctime> #include<iostream> using namespace std; typedef long long LL; const double pi=acos(-1.0); void File() { freopen("D:\\in.txt","r",stdin); freopen("D:\\out.txt","w",stdout); } template <class T> inline void

Codeforces - Colonial Mansions

梦想的初衷 提交于 2020-03-08 05:38:18
题目链接: Codeforces - Colonial Mansions 两个之间能否连通,只在于相互之间的差值。 我们用线段树维护差值即可,每个点的值是当前点和前一个点的差的绝对值。 然后二分找位置即可,注意细节。 AC代码: # pragma GCC optimize("-Ofast","-funroll-all-loops") # include <bits/stdc++.h> //#define int long long using namespace std ; const int N = 1e5 + 10 ; int n , q , h [ N ] , mx [ N << 2 ] ; inline void push_up ( int p ) { mx [ p ] = max ( mx [ p << 1 ] , mx [ p << 1 | 1 ] ) ; } void change ( int p , int l , int r , int x ) { if ( l == r ) { mx [ p ] = abs ( h [ x ] - h [ x - 1 ] ) ; return ; } int mid = l + r >> 1 ; if ( x <= mid ) change ( p << 1 , l , mid , x ) ; else change ( p <

Flex学校(99乘法表)

牧云@^-^@ 提交于 2020-03-06 18:52:17
Code <? xml version = " 1.0 " encoding = " utf-8 " ?> < mx:Application xmlns:mx = " http://www.adobe.com/2006/mxml " backgroundGradientColors = " [0xFFFFFF, 0xAAAAAA] " horizontalAlign = " left " verticalGap = " 15 " horizontalGap = " 15 " > < mx:Script > <! [CDATA[ import mx.controls.Alert; public function MultiplicationTable() { var s:String = " 九九乘法表\n " ; for (var i:Number = 1 ;i <= 9 ;i ++ ) { for (var j:Number = 1 ;j <= i;j ++ ) { s += i + " * " + j + " = " + (i * j) + " " ; } s += " \n " ; } lblTitle.text = s; // 弹出显示结果 Alert.show(s); } ]] > </ mx:Script > < mx:Button label = " 九九乘法表 "

outdated: 30. Collision Detection

≯℡__Kan透↙ 提交于 2020-03-06 03:34:50
这段代码花了我近一周时间学习。 球体之间的相互碰撞,球体与墙面之间的相互碰撞,球体与木桩之间的相互碰撞。小键盘+/-控制球体的timestep,也就是速度。UP/DOWN/LEFT/RIGHT控制camera,W/S/A/D控制位移。 F2控制camera跟进某个小球,可观察小球的碰撞路径。 一、碰撞检测 平面 圆柱 移动的球体 二、基础物理模型 碰撞应答 模拟在重力下(Using Euler Equations ) 三、特效 爆炸模型(Using A Fin-Tree Billboard Method) 音效(Using The Windows Multimedia Library) 四、文件 分为五个文件 demo.cpp : Main code Image.cpp, Image.h : Code to load bitmaps Tmatrix.cpp, Tmatrix.h : Classes to handle rotations Tray.cpp, Tray.h : Classes to handle ray operation Tvector.cpp, Tvector.h : Classes to handle vector opertation 一、碰撞检测 碰撞检测在这里使用光线追踪算法,定义的‘光线’是一个有方向的标准化向量,其方程为: (1)、平面---与平面碰撞

UVA - 11297 Census (树套树/四叉树)

人走茶凉 提交于 2020-03-01 21:09:27
题目链接 二维平面RMQ问题,单点修改,区间询问最大最小值 树套树或者四叉树均可做 树套树版本: 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=500+10,mod=1e9+7,inf=0x3f3f3f3f; 5 int n,Q,a[N][N]; 6 struct D {int mx,mi;} tr[N<<2][N<<2]; 7 D operator+(const D& a,const D& b) {return {max(a.mx,b.mx),min(a.mi,b.mi)};} 8 #define ls(u) (u<<1) 9 #define rs(u) (u<<1|1) 10 #define mid ((l+r)>>1) 11 void pu(int U,int u) {tr[U][u]=tr[U][ls(u)]+tr[U][rs(u)];} 12 D qry2(int U,int y1,int y2,int u=1,int l=1,int r=n) { 13 if(l>=y1&&r<=y2)return tr[U][u]; 14 if(l>y2||r<y1)return {~inf,inf}; 15 return qry2(U,y1,y2,ls(u)

漂亮的频谱谐波图必备 Python + Pygame

给你一囗甜甜゛ 提交于 2020-02-27 06:45:45
这个Python + Pygame程序绘制了4条衰减正弦波的轨迹,每条轴2条,彩虹色。 它会生成一系列随机谐波图(harmonographs)。 harmonograph是通常在科学博物馆中看到的机械设备,它有两个或多个带有笔的摆锤,可以在一张纸上画画。 摆笔运动,笔在纸上画出漂亮的图案。 通过绘制一起作用在绘图点上的正交正弦波,可以在计算机程序中轻松模拟这一点。 这会生成利萨如图形(Lissajous-Figure),这些图形会被衰减以形成令人愉悦的“平行”线嵌套,就像您在钞票上看到的那样。 它的速度很快,并且可以根据需要将其设置为更快(或更慢)。 提示:将显示窗口设置为全屏。 MIT许可证; 从GitHub下载 #!/usr/bin/python ''' Spectral Harmonographs Copyright 2014 Alan Richmond (Tuxar.uk) ''' print("Quit: q key, Screenshot: spacebar") import pygame, sys, random as r from pygame.locals import * from math import pi, sin, cos, exp # EDIT THESE: width,height=1280,720 # YouTube HD width,height

漂亮的频谱谐波图必备 Python + Pygame

荒凉一梦 提交于 2020-02-27 00:28:54
这个Python + Pygame程序绘制了4条衰减正弦波的轨迹,每条轴2条,彩虹色。 它会生成一系列随机谐波图(harmonographs)。 harmonograph是通常在科学博物馆中看到的机械设备,它有两个或多个带有笔的摆锤,可以在一张纸上画画。 摆笔运动,笔在纸上画出漂亮的图案。 通过绘制一起作用在绘图点上的正交正弦波,可以在计算机程序中轻松模拟这一点。 这会生成利萨如图形(Lissajous-Figure),这些图形会被衰减以形成令人愉悦的“平行”线嵌套,就像您在钞票上看到的那样。 它的速度很快,并且可以根据需要将其设置为更快(或更慢)。 提示:将显示窗口设置为全屏。 MIT许可证; 从GitHub下载 #!/usr/bin/python ''' Spectral Harmonographs Copyright 2014 Alan Richmond (Tuxar.uk) ''' print("Quit: q key, Screenshot: spacebar") import pygame, sys, random as r from pygame.locals import * from math import pi, sin, cos, exp # EDIT THESE: width,height=1280,720 # YouTube HD width,height

C++ 引用

落花浮王杯 提交于 2020-02-26 23:16:57
引用概述 就是对变量起了一个别名,然后通过别名可以来操作变量,注意的点有定义的时候必须要初始化,后面也不能更改指向 !!!引用占内存,虽然sizeof引用会是得到的操作的内存,但是是占内存的,底层实现还是通过了指针,通过操作地址来达到的别名,但是在语言层次进行了一些修饰和隐藏,sizeof引用的时候编译器会 自动处理成计算原来的那个变量,相当于是做了一个替换 引用的使用格式 //和指针一样,但是是要&,通过&来操作 int x=1; int &y=x; //y就是x的引用,操作y就是操作x const int & y=x //const引用 引用的应用场景 1,作为别名:这个就不说了,就是多了名字好操作 2,函数参数:因为值传递的话,会进行一个拷贝,但是引用传递的话不会进行内存的拷贝,那么就会节省很多时间,有些时候如果为了不改值用值传递得话可以修改成常引用来加快速度 void max(int x,int y){ //普通值传递 return x>y?x:y; } void max(const int &x,const int &y){//引用形式达到值传递的目的 return x>y?x:y; } 3,函数返回值:作为函数返回值主要也是为了节省内存空间的消耗 int mx; int max(int x,int y){ mx=x>y?x:y; return mx; } int x

图(牛客)

让人想犯罪 __ 提交于 2020-02-18 15:05:29
题目链接:图 时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 现在有一个N个点的有向图,每个点仅有一条出边 你需要求出图中最长的简单路径包含点的数量 (1≤N≤1,000,000) 输入描述: 第一行一个数字N 接下来N行,每行一个正整数,第i+1行的数字表示第i个点出边终点的编号 (点从1开始标号) 输出描述: 一行一个数字,最长的简单路径的长度 示例1 输入 复制 3 2 3 2 输出 3 解题思路 这一题也就是在有向图上遭到最长的一跳路径,因为每个节点的出度只有一条,那么我们也就可以肯定,这一条最长的单元路径的长度也就是咋调路上的点数。这里我用tarjon缩点,然后进行跑拓扑图进行的。跑到最后的一个节点的时候一定要记得加上这个节点的联通分量的个数然后减一 这是为全部是一个环 不知道为傻缩完点之后根据颜色构造新图,然后跑BFS,不知道为啥T了, 希望大佬们指点下!!! 代码 # include <bits/stdc++.h> using namespace std ; # define ll long long # define fast ios::sync_with_stdio(0) const int mx = 1000010 ; int dfn [ mx ]