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

网站建设技术选择南京自助网站建设

网站建设技术选择,南京自助网站建设,苏州建网站的公司外包服务,自己怎么设置网站D. “a” String Problem 题意 给定一个字符串 s s s,要求把 s s s 拆分成若干段,满足以下要求: 拆分出来的每一个子段,要么是子串 t t t,要么是字符 a a a子串 t t t 至少出现一次 t ≠ " a " t \ne…

D. “a” String Problem

1

题意

给定一个字符串 s s s,要求把 s s s 拆分成若干段,满足以下要求:

  1. 拆分出来的每一个子段,要么是子串 t t t,要么是字符 a a a
  2. 子串 t t t 至少出现一次
  3. t ≠ " a " t \neq "a " t="a"

问有多少种不同的子串 t t t 满足以上要求

思路

如果 s s s 全是 a a a 的话,假设 ∣ s ∣ = n |s| = n s=n,那么答案是: n − 1 n - 1 n1

否则通过简单观察我们可以发现: t t t 必须包含 a a a 字符(不一定是所有,只要 t t t 可以覆盖这些非 a a a 字符即可)

假设 s s s 从左到右第一个出现非 a a a 字符的位置是 p 0 p_0 p0,如果我们先固定 t t t 的开头在 p 0 p_0 p0
我们就可以先枚举 t t t 的长度从 1 → n − p 0 + 1 1 \rarr n - p_0 + 1 1np0+1,那么如何确定当前 t t t 是否满足上述要求?

我们直接在第一个 t t t末尾后面,找第一个出现的非 a a a 字符作为第二个 t t t 的开头,然后这后面 l e n len len 个字符必须与 t t t 相等,如果相等则继续往后检查,否则当前 t t t 无效。

我们只需要预处理每一个位置后面第一个非 a a a 字符的位置就可以,倒着扫一遍就可以线性预处理出来。
匹配的过程我们可以使用 Z Z \; Z函数,这是由于本质上是从 p 0 p_0 p0 开始的字符串,拿它去和它自己本身的每个后缀做匹配,自然可以使用 Z Z \; Z 函数。
那么这个检查过程是: O ( n log ⁡ n ) O(n \log n) O(nlogn) 的(调和级数复杂度)

那么现在问题在于: t t t 不一定是以非 a a a 字符开头的。
其实这个问题很容易处理,假设我们当前有效的从 p 0 p_0 p0 开头的 ∣ t ∣ = l e n |t| = len t=len,那么我们在检查过程的同时,记录每个 t t t 的前面到前一个 t t t 的末尾,有多少个 a a a,统计这个最小值 m n mn mn
那么很显然,当前的 t t t 可以往前扩展最多 m n mn mn a a a,最后还是有效的。
那么这里的方案数就是: m n + 1 mn + 1 mn+1

所以答案最后对于每个有效长度累加即可

时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn)

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n' 
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()const int INF=0x3f3f3f3f;
const long long INFLL=0x3f3f3f3f3f3f3f3fLL;typedef long long ll;std::vector<int> z_function(const std::string& s, int n){std::vector<int> z(n + 1, 0);z[1] = n;int l = 0, r = 0;fore(i, 2, n + 1){if(i <= r)	z[i] = std::min(z[i - l + 1], r - i + 1);while(i + z[i] <= n && s[1 + z[i]] == s[i + z[i]])++z[i];if(i + z[i] - 1 > r){l = i;r = i + z[i] - 1;}}return z;
}int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int t;std::cin >> t;while(t--){std::string s;std::cin >> s;int n = s.size();s = '0' + s;std::vector<int> nxt_nona(n + 5, n + 5);for(int i = n; i > 0; --i){if(s[i] == 'a') nxt_nona[i] = nxt_nona[i + 1];else nxt_nona[i] = i;}if(nxt_nona[1] > n){ //全是astd::cout << n - 1 << endl;continue;}int p0 = nxt_nona[1];std::string T = s.substr(p0);T = '0' + T;auto z = z_function(T, T.size() - 1);ll ans = 0;fore(len, 1, n - p0 + 2){int mn = p0 - 1;bool ok = true;int lst = p0 + len - 1;for(int j = nxt_nona[p0 + len]; j <= n; j = nxt_nona[j + len]){if(z[j - p0 + 1] < len){ok = false;break;}mn = std::min(mn, j - lst - 1);lst = j + len - 1;}if(ok)	ans += mn + 1;}std::cout << ans << endl;}return 0; 
}
http://www.yayakq.cn/news/334998/

相关文章:

  • asp 企业网站源码浙江小九天建设集团网站
  • 加强网站备案管理开网店怎么开 新手需要多少资金
  • 做网站必须认证吗杭州知名的企业网站建设策划
  • 珠宝出售网站模板网站建设总体说明书
  • 优秀企业网站模板WordPress 秒开
  • 有什么网站可以做运动郑州给公司做网站的公司
  • 深圳网站制作的免费推广途径与原因
  • 网站seo优化排名wordpress jianux
  • wordpress建站百科浙江省通信管理局 网站备案 管理部门
  • 深圳网站建设公司是临沂网站建设培训
  • 网站策划与建设阶段的推广wordpress 小程序投稿
  • 网站域名自己做免费装潢设计网站flash源码模版php生成html免费下载
  • 找个男做那个视频网站教师做班级网站
  • 江南大学做网站企业安全文化建设方案
  • 南京省住房和城乡建设厅网站网络架构方案书
  • 公司网站模板侵权案例手机站
  • 国外做装修设计网站兰州网站做的好点的公司
  • 东莞市建设局网站6wordpress怎么做目录
  • 网站建设需求分析有什么内容砀山县住房和城乡建设局网站
  • 网站 seo 设置百度查询入口
  • 北京海淀国税局网站营销策划方案ppt模板
  • 广西网站建设timkee申请企业邮箱步骤是什么?
  • 门户网站技术方案网上国网下载
  • 考试网站模版可以做家装设计的网站
  • 做seo时网站发文目的定制家具生产厂家
  • 网站友情链接模块学校微信公众号怎么创建
  • 领手工在家做的网站抖音头像的网站制作教程
  • 做编程的网站一个月多少钱网站开发科技公司
  • 东莞网站公司建设网站乐高编程培训
  • 山西住房与建设部网站美容院装修