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

怎么做网站的搜索引擎十大免费软文推广平台

怎么做网站的搜索引擎,十大免费软文推广平台,建设网站的企业多少钱,政府网站模板 html这场A-E真的简单,E题稍微卡了一会,还需要dp优化 E. Unpleasant Strings 题目: 思路: 很有学习价值的一题 这题有两个难点,第一是如何快速判断一个 t 是不是 s 的子序列,第二个是如何快速多次查找最小添加数…

这场A-E真的简单,E题稍微卡了一会,还需要dp优化

E. Unpleasant Strings

题目:

思路:

很有学习价值的一题

这题有两个难点,第一是如何快速判断一个 t 是不是 s 的子序列,第二个是如何快速多次查找最小添加数量 

我们先来解决第一个,由于要是 s 的子序列,那我们肯定要找到 t 的第一个字符在 s 中最前的位置,然后第二个字符在 s 中最前的位置(且要在第一个字符的位置之后),那么这样的查找我们怎么优化呢?如果每次循环一遍字符串肯定是不行的,所以我们要想一个快速的查找位置的方法,我们观察到每次查找都是比上一个位置大,即具有单调性,那么对于这种问题我们显然可以使用二分查找来写,因此我们记录一个数组 f[i],其代表 i 字符的位置有哪些,那么查找过程就很明显可以写出来了,我们枚举每个位置,并且选择第一个比之前位置大的合法位置,如果找不到,说明这个字符串不是子序列,否则必定是

那么找子串结束了,接下来如何快速知道要几个字符呢?

这里我直接给出我最后的优化方法,我们在判断是否合法时我们能知道子串最后一个字符对应的哪里,我们希望越快得出结果最好,那么我们可以考虑如果我们能在 O(1) 的复杂度里得出来不就很完美吗,我们观察一下,对于同一个位置我们最好的添加方式其实可以从后面的状态转移过来,比如对于 bcb,我们之后添加的方式可能是 bcba bcbb bcbc ,那我们只需要选择里面需要添加次数最少的可能即可,那么对于 bcb 的答案就是 min(bcba bcbb bcbc) + 1

那么其实答案就出来了,我们可以定义 dp[i] 为当前字符串结尾在 i 处时所需要的最小花费,那么显然转移就是 dp[i] = min(dp[j] + 1) 其中 j 就是后续添加 26 种字符之后的位置的可能,特别注意可能为 0,所以记得判断一下

具体实现看代码

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <memory>
using namespace std;
#define int long long
#define yes cout << "Yes\n"
#define no cout << "No\n"
int n, k;
string s;
vector<vector<int>> f(30);
vector<int> dp(1000006,(int)1e9);
void Init()
{for (int i = 0; i < n; i++){f[s[i] - 'a'].push_back(i);}for (int i = n - 1; i >= 0; i--){for (int j = 0; j < k; j++){auto it = upper_bound(f[j].begin(), f[j].end(), i);if (it == f[j].end()){dp[i] = 1;break;}dp[i] = min(dp[i], dp[*it] + 1);}}
}int getPos(const string& t)
{int temppos = -1;for (auto c : t){auto it = upper_bound(f[c - 'a'].begin(), f[c - 'a'].end(), temppos);if (it == f[c - 'a'].end()){return -1;}temppos = *it;}return temppos;
}
void solve()
{int q;cin >> q;for (int i = 0; i < q; i++){string t; cin >> t;if (getPos(t) == -1){cout << 0 << endl;continue;}cout << dp[getPos(t)] << endl;}
}signed main()
{cin.tie(0)->sync_with_stdio(false);int t = 1;//cin >> t;while (t--){cin >> n >> k;cin >> s;Init(); solve();}return 0;
}

http://www.dtcms.com/wzjs/215273.html

相关文章:

  • 江西省网站建设先进表彰常用的搜索引擎
  • 看b站视频软件24小时免费下载推广软文平台
  • 想在网站上放百度广告怎么做最新seo新手教程
  • 搭建影视网站日本站外推广网站
  • 站长工具seo综合查询全面解析网络营销的内涵
  • 开贴纸网站要怎么做的怎么知道自己的域名
  • 西安网站开发哪家好如何让百度搜索排名靠前
  • 帮做动态头像的网站十大免费最亏的免费app
  • 陕西省建设厅执业资格注册中心网站报名系统seo入门基础知识
  • 企业网站开发汇报谷歌广告推广怎么做
  • 广州网站建设模板电商网站前端页面内容编写
  • 如何用代码制作网站百度竞价怎么开户
  • h5开发网站优点整合网络营销公司
  • 佛山做公司网站阿里大数据平台
  • 网站制作方案策划简历个人能接广告联盟吗
  • 什么网站可以做ui小动画手机搜索引擎
  • 网站建设怎么网络营销的重要性
  • 邯郸网站建设fkop惠州seo管理
  • 网站开发设计流程时间表seo新手入门教程
  • 山东做网站推广平台怎么找客源
  • 政府网站建设合同书各大网址收录查询
  • 宜昌做网站的seo从0到1怎么做
  • 做食品网站有哪些东西百度提交入口网站网址
  • 网络推广怎么做黄页88无锡seo排名收费
  • wordpress redis手机石家庄seo外包的公司
  • 网站开发公司组织架构百度识图在线网页版
  • 网站建设 南京深圳百度关键
  • dw做网站教程专业网店推广
  • 程序员怎么做自己的网站网站模板哪里好
  • 自创字 网站一站式媒体发稿平台