首页 > 其他分享 >Codeforces 954I Yet Another String Matching Problem

Codeforces 954I Yet Another String Matching Problem

时间:2024-04-20 16:45:19浏览次数:18  
标签:字符 连通 那么 String 954I int Codeforces maxn Sigma

考虑到这个答案怎么算。
能发现相当于是对应的字符间相连边,那么一个连通块中的字符就要变成同一个字符。
于是一个连通块的代价就是 \(sz - 1\)。
所以令有 \(x\) 个连通块,最后的代价就是 \(|\Sigma| - x\)。

考虑到因为 \(|\Sigma| = 6\),而 \(B_6 = 203\)(贝尔数,\(B_n\) 意义为大小为 \(n\) 的划分的数量)。
那么就可以考虑暴力枚举每种划分,也就是每种连通块的情况。

那么如果知道了连通块的情况,那么就可以把连通块里的所有字符都变为一个相同的字符。
那么令变换完的字符串为 \(S', T'\)。
那么只要 \(S'_{l\sim r}\) 与 \(T'\) 能匹配上,\(S_{l\sim r}\) 的答案可能对应的就是当前划分的情况,当然也有可能能让划分的集合更少,所以需要取个 \(\min\)。
对于匹配的部分用个 \(\text{KMP}\) 即可。

时间复杂度 \(O(B_{|\Sigma|}(|S| + |T|))\)。

代码
#include<bits/stdc++.h>
const int maxn = 2e5 + 10;
int n, m;
char S_[maxn], T_[maxn];
int S[maxn], T[maxn], s[maxn], t[maxn];
int to[6];
int nxt[maxn];
int ans[maxn];
inline void solve(int val) {
   for (int i = 1; i <= n; i++)
      s[i] = to[S[i]];
   for (int i = 1; i <= n; i++)
      t[i] = to[T[i]];
   for (int i = 2, j = 0; i <= n; i++) {
      while (j && t[j + 1] != t[i]) j = nxt[j];
      j += t[j + 1] == t[i];
      nxt[i] = j;
   }
   for (int i = 1, j = 0; i <= n; i++) {
      while (j && t[j + 1] != s[i]) j = nxt[j];
      j += t[j + 1] == s[i];
      if (j == m) {
         ans[i] = std::min(ans[i], val);
         j = nxt[j];
      }
   }
}
void dfs(int w, std::vector<int> f) {
   if (w == 6) {
      solve(6 - f.size());
      return ;
   }
   for (int p : f)
      to[w] = p, dfs(w + 1, f);
   to[w] = w, f.push_back(w), dfs(w + 1, f);
}
int main() {
   scanf("%s%s", S_ + 1, T_ + 1);
   n = strlen(S_ + 1), m = strlen(T_ + 1);
   for (int i = 1; i <= n; i++)
      S[i] = S_[i] - 'a';
   for (int i = 1; i <= m; i++)
      T[i] = T_[i] - 'a';
   for (int i = m; i <= n; i++)
      ans[i] = 1e9;
   dfs(0, {});
   for (int i = m; i <= n; i++)
      printf("%d ", ans[i]);
   return 0;
}

标签:字符,连通,那么,String,954I,int,Codeforces,maxn,Sigma
From: https://www.cnblogs.com/rizynvu/p/18147851

相关文章

  • js substr 与 substring 有什么区别吗
    在JavaScript中,substr和substring是用于提取字符串的两个方法,它们的功能类似,但有一些区别:1.substr(start,length)方法:参数:start:必需。要提取的子字符串的起始位置。如果为负数,表示从字符串末尾开始计数。length:可选。要提取的字符数。如果省略或为负数,则提取到字符......
  • 【转载】WPF中Binding使用StringFormat格式化字符串方法
    原文链接:https://www.cnblogs.com/xuliming/articles/StringFormat.htmlWPF中Binding使用StringFormat格式化字符串方法 货币格式<TextBlockText="{BindingPrice,StringFormat={}{0:C}}"/>//$123.46货币格式,一位小数<TextBoxText="{BindingPrice,Stri......
  • python中的时间转换,秒级时间戳转string,string转时间
    importtimeimportdatetimedefpaserTime(timestamp):t=time.time()f=time.localtime(timestamp/1000)print(t)#原始时间数据#print(int(t))#秒级时间戳print(int(round(t*1000)))#毫秒级......
  • Codeforces 1824C LuoTianyi and XOR-Tree
    考虑到肯定如果能在这个节点让子树的值尽量相同肯定更好,这样子不会与上面的操作相冲突。于是有个\(\text{DP}\)的思路。记\(f_{u,i}\)为\(u\)子树内叶子节点的值都变为\(i\)的最小代价。这个有一个很好的性质,就是\(\maxf_{u,i}-\minf_{u,i}=1\)。这是因为考......
  • Codeforces Round 932 (Div. 2)题解(c、d)
    CodeforcesRound932(Div.2)C.MessengerinMAC题目大意给定一些\(a_i\)\(和b_i\),选出尽量多的\(a_i和b_i\),使得\(\sum_{i=1}^ka_{p_i}+\sum_{i=1}^{k-1}\left|b_{p_i}-b_{p_{i+1}}\right|\)小于给定的\(l\)。题目解析由于题目没有要求\(\{p\}\)是升序排列的序列,因此......
  • DbMigrator迁移数据库报错:The ConnectionString property has not been initialized.
    问题执行.DbMigrator时报错:TheConnectionStringpropertyhasnotbeeninitialized.原因情况一DbContext中没有指定连接字符串解决方案情况二appsettings.json配置文件的属性没有设置为始终复制解决方案右键appsettings.json选择属性>复制到输出目录选择始终复制或......
  • C++实现string存取二进制数据的方法
    这篇文章主要介绍了C++实现string存取二进制数据的方法,针对STL中string的用法进行了较为详细的分析,需要的朋友可以参考下 本文实例讲述了C++实现string存取二进制数据的方法,分享给大家供大家参考。具体方法分析如下:一般来说,STL的string很强大,用起来也感觉很舒服,这段时间在......
  • c++ std::string能否存储二进制字符以及'\0'字符?
    c++的字符串类std::string能否存储二进制字符以及字符'\0'?要解决这个问题,我们首先要了解c++的std::string的存储结构。(注意不同的平台下C++规范对std::string的实现不完全一致,例如sizeof(std::string)在linuxx64gcc-4.4下的输出是8,而在macgcc4.2下的输出是24;这篇文章以Li......
  • Educational Codeforces Round 163 (Rated for Div. 2) 补题记录(A~A)
    A容易发现若\(S\)串中\(s_i\)为特殊字符,则令\(s_i=s_{i+1}\),此时\(s_i\neqs_{i-1}\)。则找到一个\(j\)满足\(s_i=s_{i+1}=s_{i+2}=\ldots=s_j\neqs_{j+1}\),则\(s_j\)也一定为特殊字符。所以若\(2\midn\)则构造\(\frac{n}{2}\)个AAB,否则必然无解。#include<......
  • The request was rejected because the URL contained a potentially malicious Strin
    org.springframework.security.web.firewall.RequestRejectedException:TherequestwasrejectedbecausetheURLcontainedapotentiallymaliciousString"%2e"org.springframework.security.web.firewall.RequestRejectedException:Therequestwasrej......