mx记录

最长回文子串Manacher算法

[亡魂溺海] 提交于 2019-12-04 20:17:48
回文串是这样的abba,ababa,就是把这个串翻转过来和原串是一样的, 最长回文子串,就是在一个长串中找到一个 子串,这个子串是 长串中的最长回文子串 简单的做法是 指定前后两个指针,判断这两个指针之间的字符串是否是回文串,并记录最大值 有一个算法是来计算最长回文子串的叫做Manacher,在网上找了半天有点没看懂,最后自己在纸上模拟一下才弄懂,说一下自己的思路 首先将字符串S用‘#’分隔,以"waawabawab" 为例子 原串S变成 S: # w # a # a # w # a # b # a # w # a # b # 然后我们用一个p数组,p[i]记录 以str[i]为中间字符的回文串向右能匹配的长度 我们人工计算一下可以看到结果是这样的 S: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 i: # w # a # a # w # a # b # a # w # a # b # p[i]: 1 2 1 2 5 2 1 4 1 2 1 8 1 2 1 6 1 2 1 2 1 可以看到 当i=4时,当前字符是‘#’,以它为中间字符能构成的最长回文串是#w#a(#)a#w# ,括号内为当前字符,所以结果是5,但是这个值用程序怎么做出呢,还要以它为中间字符向左右遍历查找吗,当然不是。。。 我们引入两个变量id和mx,

Manacher算法--求最长回文子串

旧时模样 提交于 2019-12-04 20:17:12
回文和回文子串 回文串:顺着读和倒着读都一样的字符串; 回文子串:给定字符串string,若str同时满足以下两个条件:1)str是string的子串;2)str是回文串;那么str就是string的回文子串; 引出问题 要求求出上面string中最长的那个回文子串; 解决方案 方案一:枚举中心位置,对奇数位串和偶数位串分开处理; int AllAlgorithms::longestPalindrome(const char *s, int n){ int max,j; if (0 == s || n < 1) { return 0; } max = 0; for (int i = 0; i < n ; ++ i) {//i为回文串的中心 for ( j = 0; ((i - j) >= 0) && ((i+j) < n); ++j) {//如果回文串的长度是奇数 if (s[i-j] != s[i+j]) { break; } if ((j * 2 + 1) > max) { max = 2*j + 1; } } for (j = 0; ((i-j) >= 0) && ((i+j+1) < n); ++j) {//如果回文串的长度是偶数 if (s[i-j] != s[i+j+1]) { break; } if ((j * 2 + 2) > max) { max = 2*j +

最长回文子串,Manacher算法

烈酒焚心 提交于 2019-12-04 20:16:31
回文串就是一个字符串从左到右和从右到左是一样的,或者说他是关于中心对称的。 如何找出一个字符串中最长的回文子串呢(假设只有唯一的最长回文子串)?Manacher算法给出了O(n),的解法。 字符串的个数,偶数与奇数时判断有不同,为了简化,给每一个字符加一个特定的字符,这样就可以保证字符串始终是基数,如:#a#, #a#a# 其次需要一个idx,一个max和一个数组p,mx记录了当前所有回文串中最右边的位置,id就是这个回文串的中心位置,p[i]记录了一str[i]为中心的回文串的半边长。如下所示: # a # b # c # c # d # p[i] 1 2 1 2 1 2 3 2 1 2 1 当访问到b的时候,mx=4, id=3。求得p,也就求得了结果。 在求p[i]时,p[i]的初始化有两种情况: 结合参考图来理解 mx <= i,p[i] = 1; mx > i, p[i] = min(p[2*id - i], mx - i + 1) 上面我们讲的是p[i]的初始化,而不是最终的结果,j是i以id为中心的对称点,如果p[j]是在mx - i范围内的,取p[j],否则去mx-i,否则=mx-i+1. 之后在以i为中心,p[i]为边长想两端扩展,判断回文。在判断的时候需要注意不要越界,因为有结束符‘\0'存在,所以只需考虑起点就行。 string Manacher(string

域名解析 | A记录 ,CNAME,MX,NS 你懂了吗

♀尐吖头ヾ 提交于 2019-12-04 11:01:53
域名解析 | A记录 ,CNAME,MX,NS 你懂了吗 域名解析 什么是域名解析?域名解析就是国际域名或者国内域名以及中文域名等域名申请后做的到IP地址的转换过程。IP地址是网路上标识您站点的数字地址,为了简单好记,采用域名来代替ip地址标识站点地址。域名的解析工作由DNS服务器完成。 如下图,百度 www.baidu.com 就是域名,解析出来的IP 14.216.177.30 这个过程就是域名解析。 A 记录 A (Address) 记录是用来指定主机名(或域名)对应的IP地址记录。用户可以将该域名下的网站服务器指向到自己的web server上。同时也可以设置您域名的二级域名。又称IP指向,用户可以在此设置子域名并指向到自己的目标主机地址上,从而实现通过域名找到服务器。   说明:   ·指向的目标主机地址类型只能使用IP地址;   1) 添加A记录   在“主机名”中填入子域的名字,“类型”为A,“IP地址/主机名”中填入web服务器的IP地址,点击“新增”按钮即可。   注:如果“主机名”一栏为空则表示对域名mydomain.com本身做指向。   2) 修改A记录   只要在“IP地址/主机名”一栏中将原来的IP地址直接修改为新IP地址,然后点击“修改”按钮即可。   3) 删除A记录   点击要删除的A记录后面对应的“删除”按钮即可。   4) 泛域名解析  

题解[51nod1555] 布丁怪

半城伤御伤魂 提交于 2019-12-04 08:30:34
题解[51nod1555] 布丁怪 题面 解析 本文参考 这位dalao的题解 首先有一个巧妙的转换, 开一个数组记录每个横坐标的纵坐标, 简单来说就是对于点(x,y),令a[x]=y. 于是问题就变成了求满足区间最大值与最小值的差恰好等于区间长度的区间数. 于是可以考虑分治不要问我怎么想到的 设当前区间为l,r,中点为mid. mx[i]=i~mid的最大值(l<=mid),mid+1到i的最大值(i>mid) mn[i]同理. 分情况讨论: 1.区间最大值和最小值都在左边. 设右端点为j,这时候j要满足mn[j+1]<mn[i]或mx[j+1]>mx[i],否则j+1也在mn~mx这个范围里面,j肯定不能是端点. 然后再看j-i是否等于mx[i]-mn[i]. 2.最大值在左边,最小值在右边. 因为mx和mn都是单调的,所以拿两个指针L和R维护满足要求的右端点, 然后设右端点为j,则mx[i]-mn[j]=j-i, 即mx[i]+i=mn[j]+j, 开个桶维护一下就行了. code: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define ll long long #define fre(x) freopen(x".in","r",stdin),freopen

P5124 Teamwork(DP)

跟風遠走 提交于 2019-12-03 09:17:27
题目: P5124 [USACO18DEC]Teamwork 解析: 动态规划,设 \(f[i]\) 表示到第 \(i\) 位的最大值,我们枚举i之前的j个位置 \((j<k)\) ,记录一下这 \(j+1\) 个数(包括自己)的最大值 \(mx\) ,转移方程就是 \(f[i]=max(f[i],f[i-j-1]+mx\times (j+1))\) 代码: #include <bits/stdc++.h> using namespace std; const int N = 1e6 + 10; int n, m, num; int a[N], f[N]; template<class T>void read(T &x) { x = 0; int f = 0; char ch = getchar(); while (!isdigit(ch)) f |= (ch == '-'), ch = getchar(); while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar(); x = f ? -x : x; return; } int main() { read(n), read(m); for (int i = 1; i <= n; ++i) read(a[i]); for (int i = 1; i <= n; ++i) {

LOJ2461 完美的队列 分块

匿名 (未验证) 提交于 2019-12-02 23:47:01
传送门 如果对于每一个操作 \(i\) 找到这个操作中所有的数都被 pop 掉的时间 \(ed_i\) ,那么剩下就直接差分覆盖一下就可以了。 那么考虑如何求出 \(ed_i\) 。发现似乎并没有什么数据结构能够维护于是考虑分块。 对于每一个块分别考虑整块操作和散块操作的答案。 先考虑整块:注意到对于按照时间顺序的整块操作,答案一定是递增的,所以考虑双指针优化。 假设当前做到第 \(j\) 个操作,维护指针 \(k\) 表示当前已经做完了 \((j,k]\) 的所有操作。我们需要考虑当前操作会对当前块中的每一个 queue 产生怎样的影响。 记录 \(B_i\) 表示每一个队列还有 \(B_i\) 次会把当前数pop掉并记录下 \(Mx\) 表示 \(B_i\) 的最大值,同时记录标记 \(cov\) 表示 \(B_i\) 的区间标记。每一次 \(k\) 右移的时候,如果当前操作是整块操作就 \(cov+=1\) ,否则将当前区域的所有 \(B_i -= 1\) 然后更新 \(Mx\) ,当 \(Mx \leq cov\) 时表示当前操作的所有数全部被 pop 掉了。 \(j\) 往右移的时候就是撤销操作。 然后考虑散块。因为散块的数量是 \(O(M)\) 的,所以我们可以暴力枚举块中的每一个位置,复杂度也就是 \(O(M\sqrt{N})\) 的。

DNS域名工作原理及解析

假如想象 提交于 2019-12-01 08:59:11
DNS域名工作原理及解析 0x00 定义 DNS( Domain Name System)是“域名系统”的英文缩写,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53[1]。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。 开始时,域名的字符仅限于 ASCII 字符的一个子集。2008年,ICANN通过一项决议,允许使用其它语言作为互联网顶级域名的字符。使用基于 Punycode 码的 IDNS 系统,可以将 Unicode 字符串映射为有效的DNS字符集。因此,诸如“XXX.中国”、“XXX.美国”的域名可以在地址栏直接输入并访问,而不需要安装插件。但是,由于英语的广泛使用,使用其他语言字符作为域名会产生多种问题,例如难以输入,难以在国际推广等。 简单来说就是一个将域名翻译成ip地址的系统。 总结以下几点: 1)映射域名与IP 2)使用TCP/UDP:53端口 3)每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符 4)早期的DNS是只支持英文域名解析。在IDNs(国际化域名Internationalized Domain Names)推出以后,为了保证兼容以前的DNS,所以,对IDNs进行punycode转码,转码后的punycode就由26个字母+10个数字,还有“-

[golang]Go net.lookup包

試著忘記壹切 提交于 2019-11-30 12:03:19
package main import ( "fmt" "net" ) func main() { //查找DNS A记录 iprecords, _:=net.LookupIP("landv.cn") for _,ip:=range iprecords{ fmt.Println(ip) } //查找DNS CNAME记录 canme, _:=net.LookupCNAME("www.baidu.com") fmt.Println(canme) //查找DNS PTR记录 ptr,e :=net.LookupAddr("8.8.8.8") if e != nil { fmt.Println(e) } for _, ptrval:=range ptr{ fmt.Println(ptrval) } //查找DNS NS记录 nameserver,_:=net.LookupNS("baidu.com") for _,ns :=range nameserver{ fmt.Println("ns记录",ns) } //查找DNS MX记录 mxrecods,_ :=net.LookupMX("google.com") for _,mx :=range mxrecods{ fmt.Println("mx:",mx) } //查找DNS TXT记录 txtrecords, _ := net

DP+滚动数组 || [Usaco2007 Nov]Telephone Wire 架设电话线 || BZOJ 1705 || Luogu P2885

时光毁灭记忆、已成空白 提交于 2019-11-30 02:04:06
本来是懒得写题解的…想想还是要勤发题解和学习笔记…然后就滚过来写题解了。 题面: [USACO07NOV]电话线Telephone Wire 题解: F[ i ][ j ] 表示前 i 根电线杆,第 i 根电线杆长度为 j 时的最优答案 容易推出基本的转移方程: mx为初始最长的电线杆长度,显然延长后的电线杆最长不会超过mx 然后就把绝对值拆开,分类讨论一下 然后就发现这个东西可以单调队列优化DP,但是这个题目并不需要单队优化,在循环时记录一下最大值就可以 然后因为给的空间就64MB,所以要套一个滚动数组 就这样了…啊写题解好累啊 代码: 1 #include<cstdio> 2 #define max(a,b) ((a)>(b)?(a):(b)) 3 #define min(a,b) ((a)<(b)?(a):(b)) 4 #define sqr(a) ((a)*(a)) 5 using namespace std; 6 const int maxn=1e5+5,inf=1<<30,maxh=105; 7 int N,C,H[maxn],F[2][maxh],mx=0,ans=inf; 8 int main(){ 9 scanf("%d%d",&N,&C); 10 for(int i=1;i<=N;i++) scanf("%d",&H[i]),mx=max(mx,H[i]);