Feb

Posted 我微笑不代表我快乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Feb相关的知识,希望对你有一定的参考价值。

P9183 [USACO23OPEN] FEB

一道规律题$.....$

说在前面的

写这一道题,首先要知道一个东西:
如果$A$的取值为($1,3,5$)中的一种,$B$的取值为($0,2,4$)中的一种,
则$A+B$的取值为($1,3,5,7,9$)中的一种.
如果$A$的取值为($1,2,3$)中的一种,$B$的取值为($0,2,4$)中的一种,
则$A+B$的取值为($1,2,3,4,5,6,7$)中的一种.
那么:如果$A$的取值为一个等差数列$l_a-r_a$(公差为$k_a$)中的一种,$B$的取值为等差数列$l_b-r_b$(公差为$k_b$)中的一种,
则$A+B$的取值为等差数列$(l_a+l_b)-(r_a+r_b)$(公差为$\\min(k_a,k_b))$中的一种.

Solution

题意再次并不赘述,总答案为已知的字符所产生的贡献$+$字符$F$所产生的贡献

由眼可得 仔细观察,可发现$F$在字符串中只有三种可能

  • 形如$...BFFFB...$或$...EFFFE...$ 即一段连续$F$的两头相连的已知字符相同。
  • 形如$...BFFFE...$或$...EFFFB...$ 即一段连续$F$的两头相连的已知字符不相同。
  • 形如$FFF...$或$...FFF$ 即一段连续的$F$在字符串的开头或结尾

这时,可以考虑找不同情况下$F$的贡献,然后将每一段$F$的贡献合并起来,加上已知字符的贡献,便是本题答案。

第一种情况时:

  • $...BFB...$ 的贡献为 $0,2$
  • $...BFFB...$ 的贡献为 $1,3$
  • $...BFFFB...$ 的贡献为 $0,2,4$
  • $...BFFFFB...$ 的贡献为 $1,3,5$
  • $......$

第二种情况时:

  • $...BFE...$ 的贡献为 $1$
  • $...BFFE...$ 的贡献为 $0,2$
  • $...BFFFE...$ 的贡献为 $1,3$
  • $...BFFFFE...$ 的贡献为 $0,2,4$
  • $......$

第三种情况时:

  • $F...$ 的贡献为 $0,1$
  • $FF...$ 的贡献为 $0,1,2$
  • $FFF...$ 的贡献为 $0,1,2,3$
  • $FFFF...$ 的贡献为 $0,1,2,3,4$
  • $......$

所以,不同情况下的$F$的贡献都是等差数列,判断$F$的种类,合并答案便可

使用表达式的一部分进行分组

【中文标题】使用表达式的一部分进行分组【英文标题】:Group by using parts of the expression 【发布时间】:2015-02-05 19:38:10 【问题描述】:

我有一张这样的桌子:

         Name              Count
23feb.01.04.(33.03.03)       1
23feb.09.(12.04.06)          9
23feb.02.09.(25.06)          1
23feb.01.02.04               2
23feb.01.02                 48
23feb.02.13                  4
23feb.01.04.(33.03.10)       1
23feb.01.04.(33.03.06)       1
23feb.02                    48
23feb.02.07                 12
23feb.01.04.(33.03.01)       1
23feb.02.02                  3
23feb.02.04                 11
23feb                      279
23feb.02.06                  3
23feb.03                    83

有没有什么方法可以使用group by 函数来获取更高级别的Name 字符串的聚合结果?所以,理想的结果是:

  Name                     Count
  23feb                     507

怎么做?

【问题讨论】:

是使用group by和SQL的字符串函数SubString 【参考方案1】:

要避免使用Like 通配符,您可以使用LEFT

  SELECT  LEFT(name,5), COUNT(*)
  FROM     my_table
  GROUP BY LEFT(name,5)

【讨论】:

就是这样,除了对列进行分组,您还可以对列上的函数进行分组,就像上面发生的那样。使用 LEFT 或 SUBSTR 正是您的选择。一旦你按它分组,它就会成为被放入 SELECT 部分的候选者,就像也显示的那样。【参考方案2】:

您可以查询的任何(行)表达式也可以按表达式分组:

SELECT   SUBSTR(name, 1, INSTR(name, '.')), COUNT(*)
FROM     my_table
GROUP BY SUBSTR(name, 1, INSTR(name, '.'))

【讨论】:

如此接近,领先 9 秒。 我开始了解它是如何在这里工作的!但是,您的查询仍然不同。哪一个有效,取决于表中的所有值。也就是说,该表中的所有值都将存在。

以上是关于Feb的主要内容,如果未能解决你的问题,请参考以下文章

我想在 '20-FEB-81' 和 '01-MAY-81' 之间选择hiredate

使用表达式的一部分进行分组

Feb

P2894 [USACO08FEB]酒店Hotel

[USACO13FEB]出租车Taxi

BZOJ 3942: [Usaco2015 Feb]Censoring