SRM708 div1 PalindromicSubseq(动态规划+容斥原理)
题目大意:给定一个字符串,记X[i]为包含s[i]这个字符的所有子列是回文串的个数(注意是子列而不是子串),求出所有的X[i]*(i+1),然后异或起来作为返回结果
题解:
首先用容斥来想,如果当前枚举到i
那么答案就是
1、选i作为中间的字幕,(0, i-1)和(i+1, L)这两个区间相互匹配回文
2、直接选(0, i),(i+1, L)这两个区间相互匹配回文
3、直接选(0, i-1), (i, L)这两个区间相互回文匹配
然后我们发现后两种情况会有重叠情况
我们把这两种情况更细致的分一下,(0, i), (i+1,L)如果能匹配,那么必定要找到s[j] = s[i], j是属于(i+1, L)的
然后我们这样来做
令f[l][r]表示, 只用(l, r)区间就可以构成回文串的个数
令g[l][r]表示,用(0, l), (r, L)2个区间相互回文匹配构成的个数
然后没找到一对(i, j),乘一下f[i+1][j-1], g[i-1][j+1]即可
转移:
f[l][r] = f[l+1][r] + f[l][r-1] - (s[l] == s[r] ? 0 : f[l+1][r-1])
g[l][r] = g[l-1][r] + g[l][r+1] - (s[l] == s[r] ? 0 : s[l-1][r+1])
然后就可以做了
- #include <cstdio>
- #include <cmath>
- #include <cstring>
- #include <ctime>
- #include <iostream>
- #include <algorithm>
- #include <set>
- #include <vector>
- #include <sstream>
- #include <typeinfo>
- #include <fstream>
- using namespace std;
- typedef long long LL;
- const int maxn = ;
- const int MOD = 1e9 + ;
- LL F[maxn][maxn], G[maxn][maxn];
- string S;
- LL g(int l, int r){
- if(l < || r >= S.length()) return ;
- if(G[l][r]) return G[l][r];
- G[l][r] = ((LL)g(l-, r) + g(l, r+) - (S[l] == S[r] ? : g(l-, r+)))%MOD;
- return G[l][r];
- }
- LL f(int l, int r){
- if(l > r) return ;
- if(l == r) return ;
- if(F[l][r]) return F[l][r];
- F[l][r] = ((LL)f(l+, r) + f(l, r-) - (S[l] == S[r] ? : f(l+, r-)))%MOD;
- return F[l][r];
- }
- class PalindromicSubseq {
- public:
- int solve(string s) {
- memset(F, , sizeof(F));
- memset(G, , sizeof(G));
- S = s;
- LL ans = ;
- for(int i = ; i < s.length(); i++){
- LL temp = ;
- for(int j = ; j < s.length(); j++)
- if(s[i] == s[j]){
- int l = min(i, j), r = max(i, j);
- (temp += (LL)f(l+, r-)*g(l-, r+)%MOD) %= MOD;
- }
- (temp += MOD) %= MOD;
- (temp *= (LL)(i+)) %= MOD;
- ans ^= temp;
- }
- return ans;
- }
- };
SRM708 div1 PalindromicSubseq(动态规划+容斥原理)的更多相关文章
- 【BZOJ1471】不相交路径 题解(拓扑排序+动态规划+容斥原理)
题目描述 在有向无环图上给你两个起点和终点分别为$a,b,c,d$.问有几种路径方案使得能从$a$走到$b$的同时能从$c$走到$d$,且两个路径没有交点. $1\leq n\leq 200,1\le ...
- bzoj 4767 两双手 - 动态规划 - 容斥原理
题目传送门 传送门I 传送门II 题目大意 一个无限大的棋盘上有一只马,设马在某个时刻的位置为$(x, y)$, 每次移动可以将马移动到$(x + A_x, y + A_y)$或者$(x + B_x, ...
- TopCoder SRM502 Div1 1000 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/SRM502-1000.html SRM502 Div1 1000 题意 从 [0,n-1] 中选择 k 个不同的 ...
- BZOJ3622 已经没有什么好害怕的了 动态规划 容斥原理 组合数学
原文链接https://www.cnblogs.com/zhouzhendong/p/9276479.html 题目传送门 - BZOJ3622 题意 给定两个序列 $a,b$ ,各包含 $n$ 个数 ...
- TC SRM498 Div1 1000PT(容斥原理+DP)
[\(Description\)] 网格中每步可以走\((0,\cdots M_x,0\cdots M_y)\)中任意非零向量,有\(K\)种向量不能走,分别是\((r_1,r_1),(r_2,r_2 ...
- BZOJ4762 最小集合(动态规划+容斥原理)
https://www.cnblogs.com/AwD-/p/6600650.html #include<iostream> #include<cstdio> #include ...
- 51Nod1634 刚体图 动态规划 容斥原理 排列组合
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1634.html 题目传送门 - 51Nod1634 题意 基准时间限制:1 秒 空间限制:13107 ...
- BZOJ3622 已经没有什么好害怕的了(动态规划+容斥原理)
显然可以转化为一个阶梯状01矩阵每行每列取一个使权值和为k的方案数.直接做不可做,考虑设f[i][j]为前i行权值和至少为j,即在其中固定了j行选1的方案数.设第i行从1~a[i]列都是1且a[i]+ ...
- Bzoj 1042: [HAOI2008]硬币购物 容斥原理,动态规划,背包dp
1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1747 Solved: 1015[Submit][Stat ...
随机推荐
- js继承的几种方法和es6继承方法
一.原型链继 1.基本思想 利用原型链来实现继承,超类的一个实例作为子类的原型 2.具体实现 function F() {} //原型属性,原型方法: ...
- android Service服务(二)
1.1 活动和服务进行通信 上一节中我们学习了启动和停止服务的方法.不知道你又没有发现,虽然服务是在活动里启动的,但在启动了服务之后,活动和服务基本上就没关系了,确实如此,我们在活动里调用了start ...
- vue过渡动画效果
1 过渡基础 1.1 过渡的方式 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果. 包括以下工具: 在 CSS 过渡和动画中自动应用 class 可以配合使用第三方 CSS ...
- Python核心框架tornado的异步协程的2种方式
什么是异步? 含义 :双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位 现象:没有共同的时钟,不考虑顺序来了 ...
- js中面向对象(创建对象的几种方式)
1.面向对象编程(OOP)的特点: 抽象:抓住核心问题 封装:只能通过对象来访问方法 继承:从已有的对象下继承出新的对象 多态:多对象的不同形态 一.创建对象的几种方式 javascript 创建对象 ...
- webpack和sass功能简介
1.webpack webpack 是一个打包工具,为什么需要打包?因为有的人的脚本开发语言可能是 CoffeeScript 或者是 TypeScript,样式开发工具可能是 Less 或者 Sass ...
- java应用:csv文件的读写
csv数据特点: csv是文本格式,一行数据是一条记录,每个单元之间用“,”隔开.csv数据可以用Excel打开. 读写csv文件的主要程序如下所示: import java.io.BufferedR ...
- ctf题目writeup(1)
2019/1/28 题目来源:爱春秋 https://www.ichunqiu.com/battalion?t=1 1. 该文件是一个音频文件: 首先打开听了一下,有短促的长的....刚开始以为是摩斯 ...
- 《史上最简单的MySQL教程》系列分享专栏
<史上最简单的MySQL教程>系列分享专栏 <史上最简单的MySQL教程>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read ...
- java第二章 变量和运算符
Java 基础应用编程—— 变量和运算符 1.Java程序结构 数据类型:确定要存储在内存中的数据的类型. 变量:是存储数据的基本单元 2.变量的概念 变 ...