Codeforces E. Picking Strings(性质+模型转换)

E. Picking Strings
  • 题意:
    • 给定两个字符串\(S,T\),每次询问一段区间\(S[a..b]\)是否能通过如下规则变化为\(T[c..d]\)
      • \(A\rightarrow BC\)
      • \(B\rightarrow AC\)
      • \(C\rightarrow AB\)
      • \(AAA\rightarrow empty\)
    • \(|S|\le 10^5, |T|\le 10^5, Q\le 10^5\)
  • 首先应当想到\(B,C\)是等价的.

  • 于是发现\(A\rightarrow BB,B\rightarrow AB\),不难发现每一个\(B\)前面的\(A\)是无用的.

  • 核心取决于最后一段连续的\(A\).

  • 不想说,看代码吧:

bool Good() {
    Lena = min(b - Gos[b], LENS), Lenb = min(d - Got[d], LENT); //最后一段连续a的个数S,T
    if (Lena >= Lenb) { //至少要大于等于,因为B不能再其身后变一个A出来,A更不能.
        Sb = SumS[b - Lena] - SumS[a - 1]; //S串中B的个数
        Tb = SumT[d - Lenb] - SumT[c - 1]; //T串中B的个数
        if (Lena > Lenb && (Lena - Lenb) % 3 > 0 && Sb + 2 > Tb) return false; //Lena > Lenb时判断一下至少需要新增多少个B
        if (Lena == Lenb && Lena == LENS && Lenb < LENT) return false; //Lena = Lenb 时判断一下是否还有空余的B,因为只要有一个空余的B,然后差为偶数,就都能变出来.
        if (Sb <= Tb && ((Tb - Sb) % 2 == 0)) return true;
    }
    return false;
}
  • 对于这种细节题是需要技巧的,核心在于简化模型.

  • 从简单情况入手,分析冗杂的条件.

  • 简化模型是关键!!!!

猜你喜欢

转载自www.cnblogs.com/Pro-king/p/9383508.html