回文串计数

(calc.pas/calc.c/calc.cpp)

【题目描述】

虽然是一名理科生,Mcx常常声称自己是一名真正的文科生。不知为何,他对于背诵总有一种莫名的热爱,这也促使他走向了以记忆量大而闻名的生物竞赛。然而,他很快发现这并不能满足他热爱背诵的心,但是作为一名强大的Boer,他找到了这么一条自虐的方式——背诵基因序列。不过这实在是太虐心了,就连Mcx也有些招架不住。不过他发现,如果他能事先知道这个序列里有多少对互不相交的回文串,他或许可以找到记忆的妙法。为了进一步验证这个方法,Mcx决定选取一个由小写字母构成的字符串SS来实验。不过由于互不相交的回文串实在过多,他很快就数晕了。不过他相信,在你的面前这个问题不过是小菜一碟。

【名词解释】

1.对于字符串SS,设其长度为Len,那么下文用Si表示SS中第i个字符(1<=i<=Len)

2.s[i,j]表示SS的一个字串,s[i,j] = “SiSi+1Si+2…Sj-2Sj-1Sj”,比如当SS为”abcgfd”时,

s[2,5] = “bcgf” , s[1,5] = “abcgf”

3.当一个串被称为一个回文串当且仅当将这个串反写后与原串相同,如”abcba”

4.考虑一个四元组(l,r,L,R) , 当s[l,r]和s[L,R]均为回文串时,且满足1 <= l <=r< L <= R <= Len时,我们称s[l,r]和s[L,R]为一对互不相交的回文串。也即本题所求即为这种四元组的个数。两个四元组相同当且仅当对应的l,r,L,R都相同。

【题目输入】

仅一行,为字符串SS,保证全部由小写字母构成,由换行符标志结束。

【题目输出】

仅一行,为一个整数,表示互不相交的回文串的对数。

【样例输入】

aaa

【样例输出】

5

【样例解释】

SS = “aaa” , SS的任意一个字串均为回文串,其中总计有5对互不相交的回文串:

(1,1,2,2) , (1,1,2,3) , (1,1,3,3) , (1,2,3,3) , (2,2,3,3).  (这里使用名词解释中的四元组进行表示)

【数据范围】

50%的数据满足SS的长度不超过200

100%的数据满足SS的长度不超过2000

【Solution】

  先吐槽一下这题的数据,O(N3)的大暴力过了90%的点....当然下面讲的是AC做法。

  首先用区间DP求出ch[i]到ch[j]之间是不是回文串,转移方程为pldr[i][j]=pldr[i+1][j-1],注意特判i==j和j-i+1==2的情况。然后N2求出每个字符之前(包括他自己)共有多少个回文字符串,再用N2求出每个字符之后 以这个字符相邻(去重)的字符为起点的回文字符串数量。最后N求出每个点之前的数目乘上之后的数目(乘法原理)的总和,即为答案。

  AC代码:

 #include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
char ch[];
bool pldr[][];
int lenn;
int bef[],aft[];
long long ans;
int main(){
scanf("%s",ch+); lenn=strlen(ch+);
for(int i=;i<=lenn;++i) pldr[i][i]=true;
for(int i=lenn;i>=;--i)
for(int j=i;j<=lenn;++j)
if(j>=i&&ch[i]==ch[j]){
if(i==j) pldr[i][j]=true;
else if(j-i+==)pldr[i][j]=true;
else pldr[i][j]=pldr[i+][j-];
}
for(int i=;i<=lenn;++i){
bef[i]=bef[i-];
for(int j=;j<=i;++j)
if(pldr[j][i]) ++bef[i];
}
for(int i=;i<lenn;++i)
for(int j=i;j<=lenn;++j)
if(pldr[i+][j]) ++aft[i];
for(int i=;i<=lenn;++i) ans+=bef[i]*aft[i];
printf("%I64d",ans);
return ;
}

【NOIP模拟赛】【乱搞AC】【奇技淫巧】【乘法原理】回文串计数的更多相关文章

  1. NOIP模拟赛(by hzwer) T3 小奇回地球

    [题目背景] 开学了,小奇在回地球的路上,遇到了一个棘手的问题. [问题描述] 简单来说,它要从标号为 1 的星球到标号为 n 的星球,某一些星球之间有航线. 由于超时空隧道的存在,从一个星球到另一个 ...

  2. NOI.AC NOIP模拟赛 第五场 游记

    NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...

  3. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  4. NOI.AC NOIP模拟赛 第二场 补记

    NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...

  5. NOI.AC NOIP模拟赛 第一场 补记

    NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...

  6. NOI.AC NOIP模拟赛 第四场 补记

    NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...

  7. NOI.AC NOIP模拟赛 第三场 补记

    NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...

  8. CH Round #54 - Streaming #5 (NOIP模拟赛Day1)

    A.珠 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2354%20-%20Streaming%20%235%20(NOIP模拟赛Day1)/珠 题解:sb题, ...

  9. NOIP模拟赛-2018.11.7

    NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...

随机推荐

  1. 整合S2SH框架

    S2SH框架(Struts2,Spring,Hibernate)整合 Struts2.Hibernate和Spring.其中在Struts2部分主要为MVC设计思想,Struts2的处理流程及配置,S ...

  2. glibc内存泄露以及TCmalloc 简单分析

    最近开发一个私人程序时碰到了严重的内存问题,具体表现为:进程占用的内存会随着访问高峰不断上升,直到发生OOM被kill为止.我们使用valgrind等工具进行检查发现程序并无内存泄露,经过仔细调查我们 ...

  3. 2017 多校6 String

    多校6 String(ac自动机) 题意: 给一本有\(n\)个单词的字典 \(q\)个查询 \(pref_i,suff_i\) 查询字典里有多少单词前缀匹配\(pref_i\),后缀同时匹配\(su ...

  4. cf 834 E. Ever-Hungry Krakozyabra

    cf 834 E. Ever-Hungry Krakozyabra(爆搜+数位dp) 题意: 定义一种inedible tail为一个数把每一位数字按不降的顺序排列后,去掉前导0组成的序列 比如570 ...

  5. BZOJ1233 [Usaco2009Open]干草堆tower 【单调队列优化dp】

    题目链接 BZOJ1233 题解 有一个贪心策略:同样的干草集合,底长小的一定不比底长大的矮 设\(f[i]\)表示\(i...N\)形成的干草堆的最小底长,同时用\(g[i]\)记录此时的高度 那么 ...

  6. webpack配置优化

    1.使用alias简化路径 alias: { 'vue$': 'vue/dist/vue.esm.js', '@': resolve('src') } 2.overlay界面弹出编译错误 devSer ...

  7. eclipse中git的使用

    首先在Eclipse中安装EGit插件,如下图: 1. 2.点击Add 3. 4. 5. 给Eclipse安装插件很少遇到没被屏蔽的,这是一个.安装过程并不长,稍候即可. 安装成功之后我们就可以使用了 ...

  8. tips 前端 各个设备的页面尺寸的media query 与页面高度的经验总结

    有段时间 扑了一个多月的在一个wifi的前端项目上 快做完时 各种小问题一堆一堆的修复 处理了一些很零散的问题 因为页面有一个所有页面都有一个背景色 有的页面有背景图 主要重点是移动前端的方向 因为现 ...

  9. Ubuntu14连接MySql报错“can't connect to local mysql server through socket '/var/run/mysqld/mysqld.sock'”

    起因:我在Ubuntu14 64位系统中安装mysql后,后来通过mysql -u用户名 -p密码 的命令连接 Mysql数据库时,报错"can't connect to local mys ...

  10. Java并发编程--AQS

    概述 抽象队列同步器(AbstractQueuedSynchronizer,简称AQS)是用来构建锁或者其他同步组件的基础框架,它使用一个整型的volatile变量(命名为state)来维护同步状态, ...