[bzoj5508]甲苯先生的字符串
首先定义状态f[i][j]表示长度为i的串以j为结尾有多少符合条件的串,发现$f[i][j]=\sum f[i-1][k]$(j和k可以相邻),这个用矩阵乘法优化一下即可。
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define ll long long
4 #define mod 1000000007
5 struct ji{
6 ll a[31][31];
7 }a,b,c;
8 ll n,ans;
9 char s[100001];
10 ji cheng(ji a,ji b){
11 memset(c.a,0,sizeof(c.a));
12 for(int i=0;i<26;i++)
13 for(int j=0;j<26;j++)
14 if (a.a[i][j])
15 for(int k=0;k<26;k++)c.a[i][k]=(c.a[i][k]+a.a[i][j]*b.a[j][k])%mod;
16 return c;
17 }
18 int main(){
19 scanf("%lld%s",&n,s);
20 for(int i=0;i<26;i++)
21 for(int j=0;j<26;j++)a.a[i][j]=1;
22 for(int i=0;s[i+1];i++)a.a[s[i]-'a'][s[i+1]-'a']=0;
23 for(int i=0;i<26;i++)b.a[i][i]=1;
24 for(n--;n;n>>=1){
25 if (n&1)b=cheng(b,a);
26 a=cheng(a,a);
27 }
28 for(int i=0;i<26;i++)
29 for(int j=0;j<26;j++)ans=(ans+b.a[i][j])%mod;
30 printf("%lld",ans);
31 }
[bzoj5508]甲苯先生的字符串的更多相关文章
- [TJOI2019]甲苯先生的字符串——矩阵乘法+递推
题目链接: [TJOI2019]甲苯先生的字符串 我们用一个$26*26$的$01$矩阵记录任意两个字符是否能相邻. 设$f[i][j]$表示处理完前$i$个字符,第$i$个字符为$j$的方案数. 可 ...
- LG5337/BZOJ5508 「TJOI2019」甲苯先生的字符串 线性动态规划+矩阵加速
问题描述 LG5337 BZOJ5508 题解 设\(opt_{i,j}(i \in [1,n],j \in [1,26])\)代表区间\([1,i]\),结尾为\(j\)的写法. 设\(exist_ ...
- LOJ#3104「TJOI2019」甲苯先生的字符串
题目描述 一天小甲苯得到了一条神的指示,他要把神的指示写下来,但是又不能泄露天机,所以他要用一种方法把神的指示记下来. 神的指示是一个字符串,记为字符串 \(s_1\),\(s_1\) 仅包含小写字母 ...
- luogu P5337 [TJOI2019]甲苯先生的字符串
传送门 所以这题和字符串有什么关系 首先可以写出dp,\(f_{i,j}\)表示前\(i\)位,最后一个字符是\(j\)的方案,转移枚举下一位,只要不在大串中前后相邻即可.然后矩乘优化即可 // lu ...
- BZOJ 5508: [Tjoi2019]甲苯先生的字符串 矩阵乘法_思维
求 $f[i][j]=∑f[i−1][k]$,$'a'<=k<='z'$ . 用矩阵乘法转移一波即可. 竟然独自想出来了QAQ Code: #include <bits/stdc++ ...
- 【题解】Luogu P5337 [TJOI2019]甲苯先生的字符串
原题传送门 我们设计一个\(26*26\)的矩阵\(A\)表示\(a~z\)和\(a~z\)是否能够相邻,这个矩阵珂以由\(s1\)得出.答案显然是矩阵\(A^{len_{s2}-1}\)的所有元素之 ...
- TJOI2019
TJOI出一堆模板题还玩一堆梗是什么鬼 甲苯先生的字符串(矩阵快速幂) 矩阵快速幂模板题 代码 甲苯先生的滚榜(树状数组.线段树) 最开始想平衡树搞,但是平衡树太难写了 一次答案的查询相当于查询比当前 ...
- [TJOI2019]甲苯先生和大中锋的字符串——后缀自动机+差分
题目链接: [TJOI2019]甲苯先生和大中锋的字符串 对原串建后缀自动机并维护$parent$树上每个点的子树大小,显然子树大小为$k$的节点所代表的子串出现过$k$次,那么我们需要将$[len[ ...
- 洛谷P5341 [TJOI2019]甲苯先生和大中锋的字符串
原题链接P5341 [TJOI2019]甲苯先生和大中锋的字符串 题目描述 大中锋有一个长度为 n 的字符串,他只知道其中的一个子串是祖上传下来的宝藏的密码.但是由于字符串很长,大中锋很难将这些子串一 ...
随机推荐
- 使用node-gyp编写简单的node原生模块
通过样例,让我们了解如何编写一个node的原生模块.当然,这篇文章还有一个目的,是为了方便以后编写关于node-gyp的文章,搭建初始环境. 基于node-addon-api 基于node-addon ...
- Serverless 架构下的服务优雅下线实践
作者 | 行松 阿里巴巴云原生团队 应用发布.服务升级一直是一个让开发和运维同学既兴奋又担心的事情. 兴奋的是有新功能上线,自己的产品可以对用户提供更多的能力和价值:担心的是上线的过程会不会出现意外情 ...
- 在Vue中使用JSX,很easy的
摘要:JSX 是一种 Javascript 的语法扩展,JSX = Javascript + XML,即在 Javascript 里面写 XML,因为 JSX 的这个特性,所以他即具备了 Javasc ...
- Oracle中常用的to_char用法详解
Oracle函数to_char转化数字型指定小数点位数的用法 to_char,函数功能,就是将数值型或者日期型转化为字符型. 比如最简单的应用: -- 1.0123=>1.0123 SELECT ...
- flask 之上传本地图片
项目配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import os class Config(object): DEBUG = True SQLALCHEMY_DATABA ...
- vue基本指令与脚手架基本配置
脚手架(@vue/cli)创建项目启动服务 1.创建项目 vue create 项目名字 2.启动项目 进入项目根目录,运行以下命令 yarn serve 3.脚手架目录代码分析 ├── node_m ...
- [转]DDR3基本概念5 - DDR仿真中出现的Memory overflow错误的处理
ERROR: Memory overflow. Write to Address 7000fe with data xxxxxxxxxxxxxxxx4634899aabe03499 will be l ...
- gas-station leetcode C++
There are N gas stations along a circular route, where the amount of gas at station i isgas[i]. You ...
- Linux 启动/关闭 oracle 数据库
1.启动 1.1 启动监听 :lsnrctl start 1.2 启动数据库:sqlplus /nolog conn /as sysdba(或者两句一起:sqlplus sys/ as sysd ...
- 印象最深的一个bug——排查修复问题事件BEX引发的谷歌浏览器闪退崩溃异常
前言 最近,我们部门负责项目运维的小王频频接到甲方的反馈,运行的项目使用谷歌浏览器登录后,每次点击处理2秒后,浏览器自动闪退崩溃.小王同学折腾了一个星期,还没找到问题的原因.甲方客户都把问题反馈给项目 ...