考虑令$a$、$b$和$c$分别对应1、2和3,那么每一次相当于令$x$和$y$变为$x\oplus y$(要求$x\ne y$)

根据异或的结合律,我们相当于将其划分为若干个区间求异或值

(另外还有$x\ne y$的条件,归纳可证等价于要求区间异或值不为0且区间内字母不完全相等或仅有1个字母)

为了保证每一种方案都不同,强制除了第一个以外的区间任意非空前缀异或值都不为0,否则可以把该前缀加入到上一个区间中(同时此时要保证了$x\ne y$的条件)

令$f_{i}$表示前$i$个字母对应的方案数,考虑递推转移,设$j$为第一个异或前缀和等于$i$的,那么就转移到$(i,j)$,区间修改可以用差分来维护

初始状态需要考虑一下,首先需要保证异或不为0,然后若所有字母完全相同(必然是奇数个),可以理解为最后$len-1$个字母是由下一段一个非空前缀补上来的,因此允许出现

特别的,当所有字母都相同时答案为1,需要特判

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1000005
4 #define mod 1000000007
5 int n,a[N],nex[N],lst[4],f[N];
6 char s[N];
7 void update(int l,int r,int x){
8 f[l]=(f[l]+x)%mod;
9 if (r+1<n)f[r+1]=(f[r+1]+mod-x)%mod;
10 }
11 int main(){
12 scanf("%d%s",&n,s);
13 for(int i=0;i<n;i++)a[i]=s[i]-'A'+1;
14 bool flag=0;
15 for(int i=1;i<n;i++)
16 if (s[i]!=s[0])flag=1;
17 if (!flag){
18 printf("1");
19 return 0;
20 }
21 for(int i=1;i<n;i++)a[i]^=a[i-1];
22 for(int i=0;i<4;i++)lst[i]=n;
23 for(int i=n-1;i>=0;i--){
24 nex[i]=lst[a[i]];
25 lst[a[i]]=i;
26 }
27 for(int i=0;i<n;i++)
28 if (a[i])update(i,i,1);
29 for(int i=0;i<n;i++){
30 if (i)f[i]=(f[i]+f[i-1])%mod;
31 update(i+1,nex[i]-1,f[i]);
32 }
33 printf("%d",f[n-1]);
34 }

[atARC110E]Shorten ABC的更多相关文章

  1. Solution -「ARC 110E」Shorten ABC

    \(\mathcal{Description}\)   Link.   给定长度为 \(n\),包含 A, B, C 三种字符的字符串 \(S\),定义一次操作为将其中相邻两个不相同的字符替换为字符集 ...

  2. 【IOS】将一组包含中文的数据按照#ABC...Z✿分组

    上一篇文章[IOS]模仿windowsphone列表索引控件YFMetroListBox里面 我们一步步的实现了WindowsPhone风格的索引. 但是有没有发现,如果你要实现按照字母排序,你还得自 ...

  3. 在JS中关于堆与栈的认识function abc(a){ a=100; } function abc2(arr){ arr[0]=0; }

    平常我们的印象中堆与栈就是两种数据结构,栈就是先进后出:堆就是先进先出.下面我就常见的例子做分析: main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main( ...

  4. 学习Python的ABC模块(转)

    http://yansu.org/2013/06/09/learn-Python-abc-module.html 1.abc模块作用 Python本身不提供抽象类和接口机制,要想实现抽象类,可以借助a ...

  5. 将abc的全排列输出

    #include "iostream" using namespace std; void swap(char a[],int i,int j){ char temp; temp= ...

  6. 关于String str =new String("abc")和 String str = "abc"的比较

    String是一个非常常用的类,应该深入的去了解String 如: String str =new String("abc") String str1 = "abc&qu ...

  7. IE9 使用document.getElementsByName("abc") 不能获取到名称相同SPAN元素

    <div name="abc"></div> <input name="abc" type="text" /& ...

  8. 经典String str = new String("abc")内存分配问题

    出自:http://blog.csdn.net/ycwload/article/details/2650059 今天要找和存储管理相关的一些知识,网上搜了半天也没有找到完善的(30%的程度都不到),没 ...

  9. 再谈ABC

    最近一直在看蒋老师那13篇<我的WCF之旅>,终于看完了,看得很慢,记得最初出来工作的时候那时的技术总监建议我去看的,可几个月前我才开始看,看了几个月才把13篇看完.第一篇WCF的博文是我 ...

随机推荐

  1. Jenkins REST API 实例

    背景:    Jenkins具有丰富的插件生态,足以满足我们日常工作的需求,但如果我们想通过具体的Jenkins任务直接对外提供服务,而不想将内部的具体实现对外暴露(否则,需添加对应的用户权限,通过页 ...

  2. Django对表单进行增删改查

    查 首先在url中写好路径 其次在后面参数的views里写函数类xxxxxxx的基本逻辑 定义一个函数xxxxxxx,继承request,注意这个request对数据库操作结果都会存放在request ...

  3. 题解 Yet Another Number Sequence

    题目传送门 Description 给出 \(n,k\) ,求出: \[\sum_{i=1}^{n} f_i·i^k \] 其中 \(f_i\) 表示斐波拉契第 \(i\) 项.\(n\le 10^{ ...

  4. GIS应用|快速开发REST数据服务

    随着计算机的快速发展,GIS已经在各大领域得到应用,和我们的生活息息相关, 但是基于GIS几大厂商搭建服务,都会有一定的门槛,尤其是需要server,成本高,难度大,这里介绍一种在线GIS云平台,帮你 ...

  5. Noip模拟72 2021.10.9

    T1 出了个大阴间题 真就以为他出了个大阴间题就没写,打个暴力就跑了 数据范围显然摆明是状压 设$f[sta][0/1]$表示在已经选择的集合$sta$中,$A$的最大值是$A$还是$A+1$ 然后按 ...

  6. Nginx(二):Nginx的四层(L4)和七层(L7)负载均衡

    OSI七层模型 和 TCP/IP四层模型 四层负载均衡( L4 Load Balancing ) 四层负载均衡,主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内 ...

  7. 并发编程从零开始(十一)-Atomic类

    并发编程从零开始(十一)-Atomic类 7 Atomic类 7.1 AtomicInteger和AtomicLong 如下面代码所示,对于一个整数的加减操作,要保证线程安全,需要加锁,也就是加syn ...

  8. Hdu P1394 Minimum Inversion Number | 权值线段树

    题目链接 题目翻译: 约定数字序列a1,a2,...,an的反转数是满足i<j和ai>aj的数对(ai,aj)的数量. 对于给定的数字序列a1,a2,...,an,如果我们将第1到m个数字 ...

  9. Typora使用教程

    Typora简介 Typorn 是一款轻便简洁的Markdown编辑器,支持及时渲染技术,这也是与其他Markdown编辑器最显著的区别.及时渲染使得你写Markdown就像是写Word文档一样流畅自 ...

  10. openssh 7.4 升级 8.3

    1.删除旧版本(如果是远程连接升级,不能卸载旧版本,否则连接会断开.安装8.3完也不能卸载7.4,否则要到服务器直连重新安装8.3.) # rpm -qa |grep openssh #rpm -e ...