TopCoder - 15135 LongPalindromes
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的更多相关文章
- TopCoder kawigiEdit插件配置
kawigiEdit插件可以提高 TopCoder编译,提交效率,可以管理保存每次SRM的代码. kawigiEdit下载地址:http://code.google.com/p/kawigiedit/ ...
- 记第一次TopCoder, 练习SRM 583 div2 250
今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...
- TopCoder比赛总结表
TopCoder 250 500 ...
- Topcoder几例C++字符串应用
本文写于9月初,是利用Topcoder准备应聘时的机试环节临时补习的C++的一部分内容.签约之后,没有再进行练习,此文暂告一段落. 换句话说,就是本文太监了,一直做草稿看着别扭,删掉又觉得可惜,索性发 ...
- TopCoder
在TopCoder下载好luncher,网址:https://www.topcoder.com/community/competitive%20programming/ 选择launch web ar ...
- TopCoder SRM 596 DIV 1 250
body { font-family: Monospaced; font-size: 12pt } pre { font-family: Monospaced; font-size: 12pt } P ...
- 求拓扑排序的数量,例题 topcoder srm 654 div2 500
周赛时遇到的一道比较有意思的题目: Problem Statement There are N rooms in Maki's new house. The rooms are number ...
- TopCoder SRM 590
第一次做TC,不太习惯,各种调试,只做了一题...... Problem Statement Fox Ciel is going to play Gomoku with her friend ...
- Topcoder Arena插件配置和训练指南
一. Arena插件配置 1. 下载Arena 指针:http://community.topcoder.com/tc?module=MyHome 左边Competitions->Algorit ...
随机推荐
- 安装uWebSocketIO
https://github.com/uNetworking/uWebSockets sudo apt-get install libuv1-dev git clone https://github. ...
- (转)Groovy简介
转:https://www.w3cschool.cn/groovy/ Groovy的官方网站是http://www.groovy-lang.org/ Groovy是一种基于JVM(Java虚拟机)的敏 ...
- T-SQL 创建触发器 禁止插入空值
---假设在SQL SERVER 2005里面有一张表,其中有两个字段需要做唯一性约束, ---不能有重复值,但是允许其为空值,如果都是空值,则允许重复 CREATE TRIGGER [dbo].[i ...
- IIS的站点配置存储在applicationHost.config
C:\Windows\System32\inetsrv\Config\applicationHost.config
- IDEA 创建 Maven web项目注意事项
需要设置 Maven ->Runner->VM options -Dmaven.multiModuleProjectDirectory=$M2_HOME 需要添加一个archetypeCa ...
- Could not resolve placeholder'XXX' in string value "XXXX"
练习SSM项目的demo中遇到一个问题,我在applicationContext.xml中使用了<context:property-placeholder location="clas ...
- appium常见问题02_android内嵌H5页(webview)如何定位
现在大多数app都是由原生页面和内嵌H5(即webview)组成,app原生页面直接定位即可,那内嵌H5页面要如何定位呢. 相信大多数人用appium做自动化时都有遇到这个问题,小编总结了下工作中该问 ...
- HBase 中加盐之后的表如何读取:Spark 篇
在 <HBase 中加盐之后的表如何读取:协处理器篇> 文章中介绍了使用协处理器来查询加盐之后的表,本文将介绍第二种方法来实现相同的功能. 我们知道,HBase 为我们提供了 hbase- ...
- upc组队赛16 GCDLCM 【Pollard_Rho大数质因数分解】
GCDLCM 题目链接 题目描述 In FZU ACM team, BroterJ and Silchen are good friends, and they often play some int ...
- Codesys 使用共享内存 打通通讯
Codesys V3.5 平台 提供了库SysShm,其中包含了共享内存操作的接口函数: SysSharedMemoryClose; SysSharedMemoryCreate; SysShare ...