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

专业做网站+上海/新网站推广最直接的方法

专业做网站+上海,新网站推广最直接的方法,淘客怎么做网站单页,大连建设工程CF1200E Compress Words 题解 题目链接:CF1200E Compress Words 题意:给定一堆字符串,依次插入答案串尾部,每次删掉答案串的后缀 与 待插入串的前缀的最大匹配串 解法一 KMP 这个解法常数比较大 可以想到,暂时把待插…

CF1200E Compress Words 题解

题目链接:CF1200E Compress Words

题意:给定一堆字符串,依次插入答案串尾部,每次删掉答案串的后缀 与 待插入串的前缀的最大匹配串

解法一 KMP

这个解法常数比较大

可以想到,暂时把待插入串放到答案串前,然后跑一遍KMP

最后一个值就是新串的最长前后缀,也就是我们要求的最大匹配串的长度

由于直接拼接新串会导致某些时候答案超出原长

因此我们要在它们拼接的地方加上一些非字符集的字符或者乱七八糟的字符

注意不能自带border

而这样的算法还是不行的,因为答案串中有很多字符其实用不到

因此我们只要截取答案串后面的拼接即可

时间复杂度 O(∑∣si∣)=O(n)O(\sum |s_i|) = O(n)O(si)=O(n)

代码如下

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
#define N (int)(2e6+5)
int n,fail[N],len1,len2;
char ans[N],s[N];
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for(int i=1; i<=n; i++){cin >> s+1;len2=strlen(s+1);int minlen=min(len1,len2);string str="0";for(int i=1; i<=minlen; i++)str+=s[i];str+="!@#$%^&*";for(int i=len1-minlen+1; i<=len1; i++)str+=ans[i];for(int i=2,j=0; i<=minlen*2+8; i++){while(j&&str[i]!=str[j+1])j=fail[j];if(str[i]==str[j+1])++j;fail[i]=j;}for(int i=fail[minlen*2+8]+1; i<=len2; i++)ans[++len1]=s[i];}cout << ans+1 << endl;return 0;
}

解法二 字符串哈希

这里主要扯扯字符串哈希的东西

虽然之前没怎么研究,一直用的unordered_map<string,int>mp

但是这次就手写个字符串哈希吧

一般字符串哈希有两种写法,这里就按照OI WIKI默认的写法来讲了

定义哈希函数 f(s)=∑i=1ls[i]×bl−imodMf(s) = \sum\limits_{i=1}^{l}s[i]\times b^{l-i} \mod Mf(s)=i=1ls[i]×blimodM

一般来讲我们不会只用一个大质数 MMM ,而是一堆 qwq

因为这样它的 nnn 次比较的错误率会降到 1−(1−1∏Mi)n1-\left(1-\dfrac{1}{\prod M_i}\right)^n1(1Mi1)n

这个数有多小呢?我们假设只有两个大质数 1e9+7,998244353,比较1e6

那么它的值约为 0.000000000001001758730.000000000001001758730.00000000000100175873

这错误的概率还没计算机出故障的几率高吧

因此我们直接忽略不计

那么对于一个字符串xyz,它的值就等于 (xb2+yb+z)modM(xb^2+yb+z) \mod M(xb2+yb+z)modM

类比于一个 bbb 进制的数,应该还算比较好理解的

根据这个式子,如果我们要求它的一个子串 s[l…r]s[l\dots r]s[lr] 的哈希值怎么办

注意到 f(s[l…r])=∑i=lrs[i]×br−imodMf(s[l\dots r]) = \sum\limits_{i=l}^{r}s[i]\times b^{r-i} \mod Mf(s[lr])=i=lrs[i]×brimodM

因此可以得到结论 f(s[l…r])=f(s[1…r]))−f(s[1…l−1])×br−l+1modMf(s[l\dots r]) = f(s[1\dots r]))-f(s[1\dots l-1])\times b^{r-l+1} \mod Mf(s[lr])=f(s[1r]))f(s[1l1])×brl+1modM

注意这里,由于做了取模操作,f(s[l…r])f(s[l\dots r])f(s[lr]) 的值可能为负数,要注意把它转成正的

这样我们就可以 O(n)O(n)O(n) 预处理 bbbO(1)O(1)O(1) 查询了(也可以就快速幂 O(log⁡n)O(\log n)O(logn) 查询)

好的相信你已经理解了字符串哈希的一些基本东西,下面来做个简单的小例题

好吧就是这题,看它题意

很简单,直接暴力枚举+哈希就OK了,

而朴素的解法,语句 str1==str2,它实质上是 O(n)O(n)O(n) 级别的

因此我们把朴素解法的 O(n2)O(n^2)O(n2) 就可以压到 O(n)O(n)O(n)

代码如下

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
#define N (int)(1e6+5)
#define hash_cnt 2
const int hash_base[hash_cnt]={29,31};
const int hash_mod[hash_cnt]={1000000007,998244353};
struct hash_str
{char s[N];int len,hsh[hash_cnt][N];int pwd[hash_cnt][N];void init(){len=0;for(int i=0; i<hash_cnt; i++){hsh[i][0]=0;pwd[i][0]=1;}}hash_str(){init();}void add(char ch){s[++len]=ch;for(int i=0; i<hash_cnt; i++){pwd[i][len]=pwd[i][len-1]*hash_base[i]%hash_mod[i];hsh[i][len]=(hsh[i][len-1]*hash_base[i]+ch)%hash_mod[i];}}vector<int> gethash(int l,int r){vector<int> res(hash_cnt,0);for(int i=0; i<hash_cnt; i++){int t=(hsh[i][r]-hsh[i][l-1]*pwd[i][r-l+1])%hash_mod[i];t=(t+hash_mod[i])%hash_mod[i];res[i]=t;}return res;}
}s,t;
bool equal(const vector<int> &vec1,const vector<int> &vec2)
{assert(vec1.size()==vec2.size());for(int i=0; i<vec1.size(); i++)if(vec1[i]!=vec2[i])return 0;return 1;
}
int n;
char str[N];
void solve(char *str)
{int len=strlen(str+1);t.init();for(int i=1; i<=len; i++)t.add(str[i]);int d=1;for(int j=min(len,s.len); j>=1; j--)if(equal(t.gethash(1,j),s.gethash(s.len-j+1,s.len))){d=j+1;break;}for(int i=d; i<=len; i++)s.add(str[i]);
}
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for(int i=1; i<=n; i++){cin >> str+1;solve(str);}cout << s.s+1 << endl;return 0;
}

转载请说明出处

http://www.jmfq.cn/news/5171959.html

相关文章:

  • 阿里巴巴有没有帮做网站的公司/东莞网站建设最牛
  • 网站设计趋势/googlechrome浏览器
  • h5美食制作网站模板下载/平台推广文案
  • 郑州郑州网站建设河南做网站公司哪家好/英文谷歌优化
  • 合肥浦发建设集团网站/如何给公司网站做推广
  • 沙井网站推广/东莞企业网站排名
  • 东莞建设企业网站/有没有可以代理推广的平台
  • 如何自己做资源网站/seo在线优化工具
  • 互助网站开发/珠海网站建设
  • wordpress建设的是模板网站吗/百度推广是怎么做的
  • 网站建设方案云盘/注册域名后怎么建网站
  • 长沙南站建站/百度指数在线查询
  • 做网站接雕塑业务/网站推广优化教程
  • 一般做个网站多少钱/裤子seo标题优化关键词
  • 乐山网站建设/网络营销的基本方式有哪些
  • 南城网站建设公司咨询/正规seo大概多少钱
  • 小公司让我用织梦做网站/外贸网络营销
  • 带数据库的网站做/泉州seo按天计费
  • 小狗做爰网站/北京seo费用是多少
  • 高端网站设计培训机构/沈阳seo优化新势力
  • 唯品会网站建设数据安全分析/免费推广的app有哪些
  • 买什么样的主机(用来建网站的)支持下载/小程序推广平台
  • 广州网站建设怎么做/百度词条
  • 网站的推广方案有哪些/网址生成短链接
  • 网站外包维护一年多少钱/网站建设合同
  • 怎么做公司网站需要什么科目/建站系统
  • 网站建设类的职位/百度竞价一个月5000够吗
  • 目前国内有哪些网站做家具回收/seo技术教程
  • 威县网站建设代理价格/广州seo优化公司排名
  • 开封市网站建设/东莞网站设计