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

#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. 查看Linux机器名

    uname -a hostname vim /etc/sysconfig/network

  2. chart.js & canvas

    chart.js & canvas https://www.chartjs.org/samples/latest/ https://www.chartjs.org/samples/latest ...

  3. BZOJ2141排队——树状数组套权值线段树(带修改的主席树)

    题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...

  4. BZOJ1803Spoj1487 Query on a tree III——主席树

    题目大意 给一棵有点权的n个点的有根树,保证任意两点的点权不同,m次询问每次询问x的子树中权值第k大的点. 输入 先输入n,然后每个点点权,再输入n-1行每行两个数x,y代表x和y相连,再输入m,之后 ...

  5. day10 递归

    死循环,因此递归必须要定义一个明确的结束条件 def calc(n): print(n) calc(n) calc(10) return 表示终止符号,最终会得出一个确切的返回值,且可以赋值 def ...

  6. day9 集合基础命令

    集合的创建 s = set("hello") print(s) s = set({","alex","sb"}) print(s) ...

  7. LOJ #2540. 「PKUWC 2018」随机算法(概率dp)

    题意 LOJ #2540. 「PKUWC 2018」随机算法 题解 朴素的就是 \(O(n3^n)\) dp 写了一下有 \(50pts\) ... 大概就是每个点有三个状态 , 考虑了但不在独立集中 ...

  8. 稍稍乱入的CNN,本文依然是学习周莫烦视频的笔记。

    稍稍乱入的CNN,本文依然是学习周莫烦视频的笔记. 还有 google 在 udacity 上的 CNN 教程. CNN(Convolutional Neural Networks) 卷积神经网络简单 ...

  9. Leetcode 326.3的幂 By Python

    给定一个整数,写一个函数来判断它是否是 3 的幂次方. 示例 1: 输入: 27 输出: true 示例 2: 输入: 0 输出: false 示例 3: 输入: 9 输出: true 示例 4: 输 ...

  10. 自学Linux Shell1.3-Linux文件系统

    点击返回 自学Linux命令行与Shell脚本之路 1.3-Linux文件系统 文件系统是文件存放在磁盘等存储设备上的组织方法.Linux系统能支持多种目前流行的文件系统,如EXT2. EXT3. F ...