当前位置: 首页 > wzjs >正文

网站制作说明书搜狗权重查询

网站制作说明书,搜狗权重查询,凡科官方网,html5网页设计实训总结KMP 理论 KMP算法的核心是构建一个部分匹配表,也称为前缀表。这个表记录了模式串中每个位置之前的最长公共前缀和后缀的长度。例如,对于模式串"ababaca",其部分匹配表如下: 位置0123456字符ababaca最长公共前后缀长度…

KMP

理论

KMP算法的核心是构建一个部分匹配表,也称为前缀表。这个表记录了模式串中每个位置之前的最长公共前缀和后缀的长度。例如,对于模式串"ababaca",其部分匹配表如下:

位置0123456
字符ababaca
最长公共前后缀长度0012301
模式串前缀后缀最长公共前缀和后缀
a0
abab0
abaa, abba, a1
ababa, ab, ababab, ab, b2
ababaa, ab, aba, ababbaba, aba, ba, a3
ababaca, ab, aba, abab, ababababac, abac, bac, ac, c0
ababacaa, ab, aba, abab, ababa, ababacbabaca, abaca, baca, aca, ca, a1

这里的前缀是指从字符串开头开始,不包含末尾字符的所有子串;后缀则是从字符串末尾开始,不包含首位字符的所有子串。最长公共前缀和后缀指的是前缀和后缀中相同且长度最长的子串的长度。

例题

幸运字符串
问题描述
给定一个长度为 n 的字符串 S ,幸运字符串的定义如下:

  1. 该字符串为 S 的一个前缀字符串 。
  2. 该字符串在 S 中至少出现过 2 次 。
    现在要你求出长度最大的幸运字符串 。
    输入格式
    输入第一行,包含一个整数 n,表示字符串的长度 。
    输入第二行,长度为 n且由小写字母组成的字符串 。
    输出格式
    输出仅一行,包含一个整数,表示长度最大的幸运字符串的长度 。
    输入案例
7
ababaca

样例输出

3

说明
前缀 aba 在 S中出现了两次,由此答案是 3。
评测数据规模
对于 50% 的评测数据,1≤n≤2×1e3
对于 100% 的评测数据,1≤n≤2×1e5。

//本题考察对next数组含义的理解
//next[i]表示以第i个字符结尾的字符串的最长相等前后缀的长度
//本题所求的最长幸运字符串,其长度实际上就是最长相等前后缀的长度
//故本题只需要对输入的字符串求next数组,比较其中的最大值即可 
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 100;
char T[N];
int nex[N];void get_next(int n, char* S)//求S的next数组 
{nex[0] = nex[1] = 0;for (int i = 2, j = 0; i <= n; i++){while (j && S[j + 1] != S[i]) {j = nex[j];}if (S[i] == S[j + 1]) {j++;}nex[i] = j;}
}int main()
{int n;cin >> n;cin >> T + 1;get_next(n, T);//对输入的字符串计算next数组 int ans = 0;for (int i = 1; i <= n; i++)//比较得出next数组中的最大值 {ans = max(ans, nex[i]);}cout << ans << endl;return 0;
}

Manacher

理论

01 回文串的性质

  • 回文串:类似ABA,ABCBA,AABBAA 等的对于每个i具有s[i]=s[n+1-i]的字符串。
  • 回文半径:对于一个回文中心i,如果它的半径为r,如果它为奇数长度的回文串的中心,则说明[i - r+1,i+r - 1]为一个回文串。如果i是偶数长度的回文中心,则回文半径没有意义(Manacher算法会解决这个问题)。
  • 回文的递归性质:某个点的回文半径相比关于某个回文中心的点的回文半径一定相等或更大。
    举个例子,对于回文串ABACABAC,第二个B的回文半径至少是第一个B的回文半径。

02 Manacher算法
前面说过,回文半径对于偶数长度的回文的中心没有意义,例如ABBA中的B就不存在回文半径。
为了解决这个问题,Manacher发明了一种算法,他将所有的回文串都转化为了奇数长度的回文串。
方法就是在字符串中间和头尾插入特殊字符,例如原字符串为ABBA,转换后变为^#A#B#B#A#$ 。
Manacher算法是一种O(n)复杂度计算字符串中每个位置作为回文中心的回文半径的算法。
位置i的回文半径以p[i]表示,意思是在转换后的字符串中[i - p[i]+1,i + p[i]-1]是回文的。

步骤

  1. 字符串预处理
  2. 初始化变量
  3. 遍历字符串计算回文半径
  4. 还原结果

例题

题目描述
给出一个只由小写英文字符 a,b,c,…y,z 组成的字符串 S ,求 S 中最长回文串的长度 。

字符串长度为 n。

输入格式
一行小写英文字符 a,b,c,⋯,y,z 组成的字符串 S。

输出格式
一个整数表示答案。

输入输出样例
输入

aaa

输出

3

说明/提示
1≤n≤1.1×1e7。

#include<bits/stdc++.h>
using namespace std;string Get_new(string& str) {string temp = "#";for (int i = 0; str[i]; ++i) {(temp += str[i]) += "#";}return temp;
}int main() {string str;cin >> str;// 1.字符串预处理str = Get_new(str);// 动态分配一个数组 r,用于存储每个位置的回文半径// 数组长度为处理后字符串的长度int* r = (int*)calloc(sizeof(int), str.size());//2.初始化变量// c 表示当前最大回文串的中心位置int c = 0;// ans 用于记录最大回文半径int ans = 0;// 从第二个字符开始遍历处理后的字符串// 3.遍历字符串计算回文半径for (int i = 1; str[i]; ++i) {// 如果当前位置 i 在以 c 为中心的回文串范围内if (c + r[c] > i) {// 利用回文串的对称性,计算 r[i] 的初始值// r[2 * c - i] 是 i 关于 c 的对称位置的回文半径// c + r[c] - i 是 i 到当前回文串右边界的距离r[i] = min(r[2 * c - i], c + r[c] - i);}// 尝试扩展以 i 为中心的回文串// 检查左右字符是否相等while (i - r[i] >= 0 && str[i - r[i]] == str[i + r[i]]) {++r[i];}// 因为之前扩展时多算了一次,所以这里要减 1--r[i];// 如果以 i 为中心的回文串右边界超过了当前最大回文串的右边界//4.还原结果if (i + r[i] > c + r[c]) {// 更新最大回文串的中心位置为 ic = i;}// 更新最大回文半径ans = max(ans, r[i]);}// 输出最大回文半径cout << ans << endl;// 释放动态分配的内存free(r);return 0;
}
http://www.dtcms.com/wzjs/113657.html

相关文章:

  • 建设网站群的指导思想搜索引擎优化推广
  • 做网站找那些公司网络营销推广活动
  • mac做网站设计网站收录平台
  • b站推广网站友情链接seo
  • 南通网站建设制作公司网站免费推广的方法
  • 沈阳建设网站费用宣传推广方式有哪些
  • 商丘做手机做网站百度手机端推广
  • 网站上的视频深圳做网站的公司有哪些
  • 免费在线网站模板网站推广seo优化
  • 深圳网站建设ueapp推广30元一单平台
  • 中山品牌网站建设报价seo快速工具
  • 广告设计介绍seo关键字优化软件
  • 企业网站模板湖南岚鸿自己制作一个网页
  • 中扶建设网站怎么在百度上发布信息广告
  • 建设工程168网站小型培训机构管理系统
  • 做什么地方网站万江专业网站快速排名
  • 备案名 网站名南宁seo产品优化服务
  • 上海网站制作平台免费下载百度到桌面
  • 网站设置成黑白网络广告策划方案范文
  • 网站如何快速收录山西免费网站关键词优化排名
  • 网站建设费用低设计好加强服务保障满足群众急需ruu7
  • 做外贸常用的b2b网站网页设计软件dreamweaver
  • 网站视频是什么软件做的百度快照客服人工电话
  • 广东购物网站建设网站推广100种方法
  • 深圳专业网站制作公司排名如何规划企业网络推广方案
  • 网站备案查询主办单位性质为个人网站推广和优化的原因网络营销
  • 网站备案号被注销什么原因新闻发布会
  • 企业手机微网站系统phpsem运营有出路吗
  • 一般的美工可以做网站吗kol营销模式
  • 做翻译赚钱的网站怎样在百度上宣传自己的产品