https://vjudge.net/problem/TopCoder-15135

之前做过:本质不同的回文子序列个数

本题:位置不同即为不同。

如果还是设$f[l][r]$表示$l$,$r$结尾,就难受了。转移就已经是$O(n^2)$了

所以,$f[l][r]$表示,$[l,r]$的回文子序列个数

$f[l][r]=f[l+1][r]+f[l][r-1]-f[l+1][r-1]+(a[l]==a[r])*(f[l+1][r-1]+1)$

一个区间DP

但是要循环1e9次

但是其实,不管区间长度为多少,一共只有50种取值

所以,f[i][len]表示,扩展到长度为len的区间,[i,i+len-1]的子序列个数

显然i只有50个

然后矩乘转移即可。

100的size,因为还有len-2

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);(fl==true)&&(x=-x);}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
namespace Modulo{
const int mod=1e9+;
il int ad(int x,int y){return x+y>=mod?x+y-mod:x+y;}
il int sub(int x,int y){return ad(x,mod-y);}
il int mul(int x,int y){return (ll)x*y%mod;}
il void inc(int &x,int y){x=ad(x,y);}
il void inc2(int &x,int y){x=mul(x,y);}
il int qm(int x,int y=mod-){int ret=;while(y){if(y&) ret=mul(x,ret);x=mul(x,x);y>>=;}return ret;}
template<class ...Args>il int ad(const int a,const int b,const Args &...args) {return ad(ad(a,b),args...);}
template<class ...Args>il int mul(const int a,const int b,const Args &...args) {return mul(mul(a,b),args...);}
}
using namespace Modulo;
const int N=;
int n,m;
struct tr{
int a[N][N];
tr(){memset(a,,sizeof a);}
void init(){
for(reg i=;i<=m;++i){
a[i][i]=;
}
}
tr friend operator *(const tr &a,const tr &b){
tr c;
for(reg k=;k<=m;++k){
for(reg i=;i<=m;++i){
for(reg j=;j<=m;++j){
inc(c.a[i][j],mul(a.a[i][k],b.a[k][j]));
}
}
}
return c;
}
}S,A,B,C;
tr qm(tr A,ll y){
tr ret;
memset(ret.a,,sizeof ret.a);
ret.init();
while(y){
if(y&) ret=ret*A;
A=A*A;
y>>=;
}return ret;
}
class LongPalindromes{
public:
int count(int T,string s){
int n=s.length();
if(n==) return qm(,T);
m=n*;
//0~n-1
//n~m-1
//a[0][m]=1
for(reg i=;i<=n-;++i){
A.a[i][i]=;
A.a[(i+)%n][i]=;
A.a[i][i+n]=;
}
A.a[m][m]=;
B.init();
for(reg len=;len<=n;++len){
C=A;
for(reg i=;i<n;++i){
C.a[(i+)%n+n][i]=sub((s[i]==s[(i+len-)%n]),);
C.a[m][i]=(s[i]==s[(i+len-)%n]);
}
B=B*C;
}
S.a[][m]=;
S=S*qm(B,T);
// printf("%d\n",
return ad(S.a[][],);
}
};

相同的保留一份即可。减少状态。利于矩乘。

TopCoder - 15135 LongPalindromes的更多相关文章

  1. TopCoder kawigiEdit插件配置

    kawigiEdit插件可以提高 TopCoder编译,提交效率,可以管理保存每次SRM的代码. kawigiEdit下载地址:http://code.google.com/p/kawigiedit/ ...

  2. 记第一次TopCoder, 练习SRM 583 div2 250

    今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...

  3. TopCoder比赛总结表

    TopCoder                        250                              500                                 ...

  4. Topcoder几例C++字符串应用

    本文写于9月初,是利用Topcoder准备应聘时的机试环节临时补习的C++的一部分内容.签约之后,没有再进行练习,此文暂告一段落. 换句话说,就是本文太监了,一直做草稿看着别扭,删掉又觉得可惜,索性发 ...

  5. TopCoder

    在TopCoder下载好luncher,网址:https://www.topcoder.com/community/competitive%20programming/ 选择launch web ar ...

  6. TopCoder SRM 596 DIV 1 250

    body { font-family: Monospaced; font-size: 12pt } pre { font-family: Monospaced; font-size: 12pt } P ...

  7. 求拓扑排序的数量,例题 topcoder srm 654 div2 500

    周赛时遇到的一道比较有意思的题目: Problem Statement      There are N rooms in Maki's new house. The rooms are number ...

  8. TopCoder SRM 590

     第一次做TC,不太习惯,各种调试,只做了一题...... Problem Statement     Fox Ciel is going to play Gomoku with her friend ...

  9. Topcoder Arena插件配置和训练指南

    一. Arena插件配置 1. 下载Arena 指针:http://community.topcoder.com/tc?module=MyHome 左边Competitions->Algorit ...

随机推荐

  1. vue.js中created()与activated()的个人使用理解

    created():在创建vue对象时,当html渲染之前就触发:但是注意,全局vue.js不强制刷新或者重启时只创建一次,也就是说,created()只会触发一次:这时候只有dom没有数据挂载. a ...

  2. 如何在vue里面调用高德地图

    1.修改webpac.base.conf.js文件 与module同一级添加 externals: { 'AMap': 'AMap', 'AMapUI': 'AMapUI' }配置. 然后在index ...

  3. 洛谷P3366 【模板】最小生成树(LCT)

    [模板]最小生成树 题目传送门 解题思路 用LCT来维护最小生成树. 除了把各顶点作为节点外,每条边也都视为一个节点.对于要加入的边\(e\),检查其两顶点\(x\)和\(y\)是否在同一棵树中,如果 ...

  4. Qt Creator 中的插件Plugin, 区分说明。。。

    Qt Creator 中可以创建 三中类型的插件Plugin: 1.用的最多的,派生自QGenericPlugin类: 在新建Library,   Plugin类型工程中,新建. 调用使用QPlugi ...

  5. websocket 服务搭建

    链接过程 前端 1.CREATED WEBSOCKE 2.ONOPEN 3.ONMESSAGE 服务端 1.收到request 2.给客户端发送消息,生成id //msg { type: " ...

  6. SpringMVC学习(12):基于Hibernate+Spring+Spring MVC+Bootstrap的管理系统实现

    到这里已经写到第12篇了,前11篇基本上把Spring MVC主要的内容都讲了,现在就直接上一个项目吧,希望能对有需要的朋友有一些帮助. 一.首先看一下项目结构: InfrastructureProj ...

  7. springmvc 异常统一处理的三种方式详解

    1 描述  在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦 ...

  8. mutt配置太繁琐,如果lz你只是单纯为了发邮件的话,其实用mailx就足以了

    mutt配置太繁琐,如果lz你只是单纯为了发邮件的话,其实用mailx就足以了 复制内容到剪贴板 代码: yum -y install mailx echo "Server  port fa ...

  9. JQuery 获取表格table所有行第一列

    main_table 是表ID $("#main_table tr").find("td:eq(0)")

  10. 五、bootstrap-fileinput

    一.bootstrap-fileinput <!DOCTYPE html> <html lang="en"> <head> <meta c ...