给定一个由小写字母组成的字符串,输出有多少重复的回文子序列

#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 & 简单容斥)的更多相关文章

  1. 2019.02.09 bzoj2560: 串珠子(状压dp+简单容斥)

    传送门 题意简述:nnn个点的带边权无向图,定义一个图的权值是所有边的积,问所有nnn个点都连通的子图的权值之和. 思路: fif_ifi​表示保证集合iii中所有点都连通其余点随意的方案数. gig ...

  2. 青云的机房组网方案(简单+普通+困难)(虚树+树形DP+容斥)

    题目链接 1.对于简单的版本n<=500, ai<=50 直接暴力枚举两个点x,y,dfs求x与y的距离. 2.对于普通难度n<=10000,ai<=500 普通难度解法挺多 ...

  3. [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥

    题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...

  4. $HDU$ 4336 $Card\ Collector$ 概率$dp$/$Min-Max$容斥

    正解:期望 解题报告: 传送门! 先放下题意,,,已知有总共有$n$张卡片,每次有$p_i$的概率抽到第$i$张卡,求买所有卡的期望次数 $umm$看到期望自然而然想$dp$? 再一看,哇,$n\le ...

  5. bzoj3622已经没有什么好害怕的了 dp+组合+容斥(?)

    3622: 已经没有什么好害怕的了 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1033  Solved: 480[Submit][Status][ ...

  6. BZOJ4361 isn 树状数组、DP、容斥

    传送门 不考虑成为非降序列后停止的限制,那么答案显然是\(\sum\limits_{i=1}^N cnt_i \times (N-i)!\),其中\(cnt_i\)表示长度为\(i\)的非降序列数量 ...

  7. 洛谷P4859 已经没有什么好害怕的了 [DP,容斥]

    传送门 思路 大佬都说这是套路题--嘤嘤嘤我又被吊打了\(Q\omega Q\) 显然,这题是要\(DP\)的. 首先思考一下性质: 为了方便,下面令\(k=\frac{n+k}{2}\),即有恰好\ ...

  8. CodeForces - 285E: Positions in Permutations(DP+组合数+容斥)

    Permutation p is an ordered set of integers p1,  p2,  ...,  pn, consisting of n distinct positive in ...

  9. 【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, ...

随机推荐

  1. Postgresql 密码设置

    今天下午 陷进去了 其实很简单的一个事情结果浪费了 接近一个小时. 做事情必须要细致一些. 自己的确做的不好. 这里面简单说一下pg_hba.conf 和 postgresql 密码的一些设置问题. ...

  2. Angular $location获取端口号

    <!DOCTYPE html><html ng-app="myApp"><head lang="en"> <meta ...

  3. FICO基础知识(一)

    GL – 总账 (General Ledger) 总帐核算的中心任务是提供外部会计及其所涉及帐户的概貌. 总账会计主要用途:根据不同的会计准则(如欧洲的 IAS, 美国的GAAP, 中国国家会计准则) ...

  4. 洛谷 P3657 [USACO17FEB]Why Did the Cow Cross the Road II P

    题面 大意:让你把两个n的排列做匹配,连线不想交,而且匹配的数字的差<=4,求最大匹配数 sol:(参考了kczno1的题解)对于第一个排列从左往右枚举,用树状数组维护到达另一个序列第i个数字的 ...

  5. Layui_HDFS目录(上传,下载,删除,分页,下级目录,键盘控制返回上一页)

    注:转载请署名 一.实体 package com.ebd.application.modules.fileManage.pojo; public class FilesOrDirs { private ...

  6. Codeforces 741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree)

    感觉dsu on tree一定程度上还是与点分类似的.考虑求出跨过每个点的最长满足要求的路径,再对子树内取max即可. 重排后可以变成回文串相当于出现奇数次的字母不超过1个.考虑dsu on tree ...

  7. Python向来以慢著称,为啥Instagram却唯独钟爱它?

    PyCon 是全世界最大的以 Python 编程语言 为主题的技术大会,大会由 Python 社区组织,每年举办一次.在 Python 2017 上,Instagram 的工程师们带来了一个有关 Py ...

  8. 用powershell 批量卸载 windows 更新

    $KBID = "KB958488" $KBID1 = "KB976902" cls function Remove-Update { $HotFixes = ...

  9. tf 常用函数 28原则

    一个tensorflow图由以下几部分组成: 占位符变量(Placeholder)用来改变图的输入. 模型变量(Model)将会被优化,使得模型表现得更好. 模型本质上就是一些数学函数,它根据Plac ...

  10. 洛谷P1247 取火柴游戏

    经典NIM游戏. 取XOR和即可. 注意输出方案时,找到大于异或和sum的,变为a[i] ^ sum即可. #include <cstdio> ; int a[N]; int main() ...