cdqz2017-test10-加帕里图书馆(区间DP & 简单容斥)
给定一个由小写字母组成的字符串,输出有多少重复的回文子序列


#include<cstdio>
#include<cstring> using namespace std; #define N 2002 const int mod=1e9+; int n;
char s[N]; int f[N][N],g[N][N]; int pre[N][],nxt[N][]; int get_f(int l,int r)
{
if(l>r) return ;
int &ans=f[l][r];
if(ans!=-) return ans;
if(s[l]==s[r]) ans=get_f(l+,r)+get_f(l,r-);
else ans=get_f(l+,r)+get_f(l,r-)-get_f(l+,r-);
ans%=mod;
if(ans<) ans+=mod;
return ans;
} int get_g(int l,int r)
{
if(l==r) return ;
if(l>r) return ;
int &ans=g[l][r];
if(ans!=-) return ans;
if(s[l]!=s[r]) ans=get_g(l+,r)+get_g(l,r-)-get_g(l+,r-);
else
{
if(nxt[l][s[l]-'a']>=r && pre[r][s[r]-'a']<=l) ans=get_g(l+,r-)*+;
else if(nxt[l][s[l]-'a']==pre[r][s[r]-'a']) ans=get_g(l+,r-)*;
else ans=get_g(l+,r-)*-get_g(nxt[l][s[l]-'a']+,pre[r][s[r]-'a']-);
}
ans%=mod;
if(ans<) ans+=mod;
return ans;
} void cal()
{
for(int i=;i<=n;++i)
{
for(int j=i+;j<=n;++j)
if(!nxt[i][s[j]-'a']) nxt[i][s[j]-'a']=j;
for(int j=i-;j;--j)
if(!pre[i][s[j]-'a']) pre[i][s[j]-'a']=j;
}
} int main()
{
freopen("library.in","r",stdin);
freopen("library.out","w",stdout);
scanf("%s",s+);
n=strlen(s+);
memset(f,-,sizeof(f));
int all=get_f(,n);
cal();
memset(g,-,sizeof(g));
int dif=get_g(,n);
int ans=all-dif;
if(ans<) ans+=mod;
printf("%d",ans);
}
爆搜代码
#include<cstdio>
#include<cstring> using namespace std; int n;
char s[]; char tt[],t[];
int L; int ans,sum; int cnt[]; void find(int now,int len,int ok)
{
if(ok==len)
{
sum++;
return;
}
for(int i=now+;i<=n;++i)
if(t[ok+]==s[i]) find(i,len,ok+);
} void dfs(int len)
{
for(int i=;i<;++i)
{
tt[len]=char(i+'a');
L=;
for(int j=len;j;--j) t[++L]=tt[j];
for(int j=;j<=len;++j) t[++L]=tt[j];
sum=;
find(,L,);
if(sum>) ans+=sum-;
if(sum) dfs(len+);
}
} void dfs2(int len)
{
for(int i=;i<;++i)
{
tt[len]=char(i+'a');
L=;
for(int j=len;j;--j) t[++L]=tt[j];
for(int j=;j<=len;++j) t[++L]=tt[j];
sum=;
find(,L,);
if(sum>) ans+=sum-;
if(sum) dfs2(len+);
}
} int main()
{
freopen("library.in","r",stdin);
freopen("library.out","w",stdout);
scanf("%s",s+);
n=strlen(s+);
for(int i=;i<=n;++i) cnt[s[i]-'a']++;
dfs();
dfs2();
printf("%d",ans);
}
cdqz2017-test10-加帕里图书馆(区间DP & 简单容斥)的更多相关文章
- 2019.02.09 bzoj2560: 串珠子(状压dp+简单容斥)
传送门 题意简述:nnn个点的带边权无向图,定义一个图的权值是所有边的积,问所有nnn个点都连通的子图的权值之和. 思路: fif_ifi表示保证集合iii中所有点都连通其余点随意的方案数. gig ...
- 青云的机房组网方案(简单+普通+困难)(虚树+树形DP+容斥)
题目链接 1.对于简单的版本n<=500, ai<=50 直接暴力枚举两个点x,y,dfs求x与y的距离. 2.对于普通难度n<=10000,ai<=500 普通难度解法挺多 ...
- [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥
题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...
- $HDU$ 4336 $Card\ Collector$ 概率$dp$/$Min-Max$容斥
正解:期望 解题报告: 传送门! 先放下题意,,,已知有总共有$n$张卡片,每次有$p_i$的概率抽到第$i$张卡,求买所有卡的期望次数 $umm$看到期望自然而然想$dp$? 再一看,哇,$n\le ...
- bzoj3622已经没有什么好害怕的了 dp+组合+容斥(?)
3622: 已经没有什么好害怕的了 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1033 Solved: 480[Submit][Status][ ...
- BZOJ4361 isn 树状数组、DP、容斥
传送门 不考虑成为非降序列后停止的限制,那么答案显然是\(\sum\limits_{i=1}^N cnt_i \times (N-i)!\),其中\(cnt_i\)表示长度为\(i\)的非降序列数量 ...
- 洛谷P4859 已经没有什么好害怕的了 [DP,容斥]
传送门 思路 大佬都说这是套路题--嘤嘤嘤我又被吊打了\(Q\omega Q\) 显然,这题是要\(DP\)的. 首先思考一下性质: 为了方便,下面令\(k=\frac{n+k}{2}\),即有恰好\ ...
- CodeForces - 285E: Positions in Permutations(DP+组合数+容斥)
Permutation p is an ordered set of integers p1, p2, ..., pn, consisting of n distinct positive in ...
- 【HDOJ5519】Kykneion asma(状压DP,容斥)
题意:给定n和a[i](i=0..4),求所有n位5进制数中没有前导0且i出现的次数不超过a[i]的数的个数 2<=n<=15000,0<=a[i]<=3e4 思路:设f(n, ...
随机推荐
- vCenter简单查看多少虚拟机在开机状态和一共多少虚拟机
vCenter 界面上面不好找 具体的开机 运行数目 但是数据库里面比较好差 登录vCenter的数据库. 查看表主要是 查看正在开机的虚拟机 select * from dbo.VPX_VM WHE ...
- centos mpeg acc 解码器安装
# yum -y install http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noar ...
- Flutter & Dart
Flutter & Dart https://www.dartlang.org/install https://flutter.dev/ https://flutter.dev/docs/ge ...
- Lodop打印控件里SET_PRINT_STYLE和SET_PRINT_STYLEA
LODOP.SET_PRINT_STYLE 对该语句后面的打印项样式设置效果.LODOP.SET_PRINT_STYLEA 针对第一个参数设置的打印项样式设置效果.这两个语句,作用范围不同. 在设置字 ...
- Lodop代码设置打印机等信息后 设置预览可重选
Lodop打印控件默认在代码里指定了打印.纸张.纸张方向.份数等信息,在预览的界面的设置里是无法重新选择的,默认是禁止重选的,如果重选会提示,例如:“打印方向”已由程序控制,无法改变!“纸张大小”已由 ...
- iOS 页面之间的转场动画控制器间的转换
CATransition类实现层的转场动画.你可以从一组预定义的转换或者通过提供定制的CIFilter实例来指定转场效果. 例如:控制器之间的跳转 LoginViewController *myVC ...
- python---str和repr
在 Python 中要将某一类型的变量或者常量转换为字符串对象通常有两种方法,即 str() 或者 repr() . 区别与使用 函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为 ...
- jsp操作MySQL时报错:Operation not allowed after ResultSet closed
一个stmt对多个rs进行操作引起的ResultSet关闭的错误 解决办法:创建新的stmt,一个rs对应一个stmt
- 洛谷 P2158 [SDOI2008]仪仗队 解题报告
P2158 [SDOI2008]仪仗队 题目描述 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线 ...
- wireshark配合jmeter测试webservice接口
1.首先,获取本地和接口的ip,以便设置过滤 2.wireshark设置过滤 ip.dst==192.168.0.101 and ip.src==61.147.124.120 and http 3.执 ...