首页 > 其他分享 >ARC181 - B - Annoying String Problem

ARC181 - B - Annoying String Problem

时间:2024-08-05 23:18:42浏览次数:6  
标签:dots String iff 等式 字符串 长度 Problem Annoying gcd

B - 令人讨厌的字符串问题 编辑:evima


在大多数情况下,\(f(S,T,X)\) 和\(f(S,T,Y)\) 的长度相等,这揭示了\(T\) 的长度。让我们来看看当已知 \(S\) 和 \(T\) 的长度时,在什么条件下 \(S\) 和 \(T\) 满足 \(f(S,T,X)=f(S,T,Y)\)。

例题


例如,当\(|S|=6\)和\(|T|=4\)时,让我们考虑当\(S+T+T+S+T+S=T+T+T+S+T+T+T\)成立时的情况。通过比较开头,需要 \(T\) 是 \(S\) 的前缀,并且 \(S\) 可以用 \(S'\) 表示为 \(S=T+S'\),\(|S'|=2\)。将其代入等式,我们得到:

\(T+S'+T+T+T+S'+T+T+S' = T+T+T+T+S'+T+T+T\)

\(\iff S'+T+T+T+S'+T+T+S' = T+T+T+S'+T+T+T\)。

接下来,\(S'\) 必须是\(T\) 的前缀,而\(T\) 可以用\(T'\) 表示为\(T=S'+T'\),\(T'||=2\)。将其替换到等式中,我们得到

\(S'+\)(\(S'\) 和 \(T'\) 的表达式)\(=T'+\)(\(S'\)和 \(T'\) 的表达式)。

在这个等式中,\(S'=T'\) 是必要且充分的,因为 \(|S'|\) 和 \(|T'|\) 相等。用 \(S'=T'=U\) 表示 \(S\) 和 \(T\) ,我们得到 \(S=U+U+U\) 和 \(T=U+U\) 。反之,如果 \(S\) 和 \(T\) 可以用这种方法表示,那么 \(S\) 和 \(T\) 的连接将是 \(U\) 的重复,从而使等式明显成立。因此

  • \(|S|=6, |T|=4\), 以及 \(S+T+T+S+T+S=T+T+T+S+T+T\) \(\iff\) \(S\)和 \(T\)可以用长度为\(2\)的字符串\(U\)表示为\(S=U+U+U\)和\(T=U+U\)。

观察

推广上述过程,我们会发现

  • 如果等式为三元形式,如 \(A+A+B=A+A+B\),则对任意 \(A\) 和 \(B\) 都成立。
  • 如果等式中使用的两个字符串 \(A\) 和 \(B\) 的长度不同(假设 \(|A| < |B|\)),则等式的形式为 \(A+(\dots)=B+(\dots)\),此时需要 \(B=A+B'\),从而将问题简化为关于 \(A\) 和 \(B'\) 的相同形式。
  • 如果等式中使用的两个字符串 \(A\) 和 \(B\) 的长度相等,则 \(A=B\) 是必要且充分的。

特别是,第二次还原会重复进行,直到最终达到第一或第三状态。

考虑到通过重复还原达到的最终状态,第二次还原的形式如下:

  • \(A+A+(\dots) = B+(\dots) \iff A + A + (\dots) = A + B' + (\dots) \iff A + (\dots) = B' + (\dots)\)
  • \(A+B+(\dots) = B+(\dots) \iff A + A + B'+ (\dots) = A + B' + (\dots) \iff A + B' + (\dots) = B' + (\dots)\)

因此,如果初始方程不是三元形式,方程在第二次还原时就不会还原到第一种状态,而总是会到达第三种状态。

从第三状态追溯诸如\(B=A+B'\)这样的替换,有必要且充分条件是\(A\)和\(B\)是长度为\(L\)的共同字符串\(C\)的重复,其中\(L\)是第三状态中字符串\(A\)和\(B\)的长度。

因此,一旦确定了 \(L\),就可以轻松检查条件。考虑到第二次还原过程中的长度变化,可以将其视为 \((n,m)\rightarrow (n,m-n)\) 一直重复到 \(n=m\)。这正是欧几里得算法,所以 \(L=\mathrm{gcd}(n,m)\)。

解法

首先,考虑 \(X\) 和 \(Y\) 中 1 的数量相等的情况。如果0的数量也相等,设置 \(T=S\) 显然满足 \(f(S,T,X)=f(S,T,Y)\),所以答案是Yes。否则,\(f(S,T,X)\) 和\(f(S,T,Y)\) 的长度不可能相等,所以答案是No

如果 \(X\) 和 \(Y\) 中的 1 数量不相等,我们就有 \(X\neq Y\),\(|f(S,T,X)|=|f(S,T,Y)|\) 就会产生一个以 \(|T|\) 为单位的线性方程,让我们找到 \(|T|\)(如果这不是整数或为负数,答案就是No)。

根据上述观察,当 \(X\neq Y\)、

★ \(f(S,T,X)=f(S,T,Y) \iff S\) 和 \(T\) 是长度为 \(\mathrm{gcd}(|S|,|T|)\) 的字符串 \(U\) 的重复。

因此,如果 \(S\) 的周期为 \(\mathrm{gcd}(|S|,|T|)\),那么满足条件的 \(T\) 就存在。这可以在 \(O(|S|)\) 时间内通过验证 \(S\) 的第 \(i\) 个字符是否等于第 \((i+\mathrm{gcd}(|S|,|T|))\) 个字符来检验。

★的正式证明:

通过对 \(||S|-|T||\) 的归纳来证明。当 \(|S|=|T|\) 时,证明就很清楚了。

假设 \(|S| < |T|\) 不失一般性。同时,由于 \(X \neq Y\),通过去除所需的公共前缀,我们可以假设 \(X\) 和 \(Y\) 的第一个字符分别是 01。那么,\(S\)必须是\(T\)的前缀,并且存在\(T'\),使得\(T=S+T'\)。为使等式成立,需要\(f(S,T',X')=f(S,T',Y')\),其中\(X'\)和\(Y'\)分别是在\(X\)和\(Y\)中同时用01替换1得到的字符串。根据归纳假设,\(S\)和\(T'\)是长度为\(\mathrm{gcd}(|S|,|T|-|S|)=\mathrm{gcd}(|S|,|T||)\) 的字符串\(U\)的重复。结合 \(T=S+T'\),可以看出 \(T\) 也是 \(U\) 的重复。这样,必然性就得到了证明。充分性显而易见。

通过www.DeepL.com/Translator(免费版)翻译

标签:dots,String,iff,等式,字符串,长度,Problem,Annoying,gcd
From: https://www.cnblogs.com/gutongxing/p/18344228

相关文章

  • String类常用方法
    常用方法字符串比较:equals(Objectanother):比较两个字符串的内容是否相等。equalsIgnoreCase(Stringanother):比较两个字符串的内容,忽略大小写。字符串长度:length():返回字符串的长度。字符串转换:toString():返回其自身的字符串表示形式。valueOf(类型x......
  • StringBuffer 和 StringBuilder
    StringBuffer和StringBuilder目录StringBuffer和StringBuilderStringBuffer:StringBuilder常用方法StringBuffer:StringBuffer是线程安全的。这意味着它的方法是同步的,可以在多线程环境中使用而不会出现问题。由于同步,StringBuffer的性能比StringBuilder稍低,特别是......
  • 洛谷P1001 A+B Problem的一些歪解(淼作)
    一、LCT#include<iostream>#include<cstring>#include<cstdio>#include<cstring>usingnamespacestd;structnode{intdata,rev,sum;node*son[2],*pre;booljudge();boolisroot();voidpushdown();voidupda......
  • [LeetCode] 2053. Kth Distinct String in an Array
    Adistinctstringisastringthatispresentonlyonceinanarray.Givenanarrayofstringsarr,andanintegerk,returnthekthdistinctstringpresentinarr.Iftherearefewerthankdistinctstrings,returnanemptystring"".Notethat......
  • String类
    String类一.字符串常量池在Java(以及许多其他编程语言中),字符串常量值是指那些在程序中直接以字符串字面量形式给出的值。这些值被双引号("")包围,并且一旦在代码中定义,就不能被改变(尽管你可以将字符串变量指向另一个字符串常量或字符串对象的引用)。字符串常量值在编译时会被存储在......
  • 【简单菊花图】Codeforce 1583Problem - B.md
    1583Problem-B-Codeforces题目大意:n个点的无根树给出m个限制条件(a,c,b)在a到b路径上不能存在c点,求任意一种可能的树的所有边注意数据范围:1<m<n<1e5这说明了最多有n-1个限制条件这说明至少有一个点不存在限制条件即这个点可以作为根节点root连接其他所有点形成边......
  • EFCore执行自定义SQL时格式化错误:Input string was not in a correct format.
      记录一下EFCore执行自定义SQL报System.FormatException异常的问题,这个异常可能是“Inputstringwasnotinacorrectformat.”,也可能是其它格式化异常,比如:System.ArgumentException:“Formatoftheinitializationstringdoesnotconformtospecificationstartingat......
  • C++ //练习 15.31 已知s1、s2、s3和s4都是string,判断下面的表达式分别创建了什么样的
    C++Primer(第5版)练习15.31练习15.31已知s1、s2、s3和s4都是string,判断下面的表达式分别创建了什么样的对象:(a)Query(s1)|Query(s2)&~Query(s3);(b)Query(s1)|(Query(s2)&~Query(s3));(c)(Query(s1)&(Query(s2))|(Query(s3)&Query(s4)));......
  • 嵌入式学习day9(string函数族)
    一丶strcpy和strncpy1.strcpy    #include<string.h>    char*strcpy(char*dest,constchar*src);    功能:实现字符串复制    参数:char*dest:目标字符串首地址    constchar*src:原字符串首地址    返回值:目标字符串首地......
  • QString成员函数一览表
    QString类是Qt框架中的一个核心类,用于处理Unicode字符串。它提供了大量的成员函数,用于字符串的创建、操作、查询和转换。以下是QString类的一些主要成员函数,按照功能分类:构造和赋值-QString():构造一个空字符串。-QString(constchar*):从ASCII字符串构造。-Q......