题目链接:

[TJOI2019]甲苯先生的字符串

我们用一个$26*26$的$01$矩阵记录任意两个字符是否能相邻。

设$f[i][j]$表示处理完前$i$个字符,第$i$个字符为$j$的方案数。

可以发现将$f[i]$这个$1*26$的矩阵与$26*26$的$01$矩阵相乘即可得到$f[i+1]$的矩阵。

直接将$01$矩阵矩乘即可。

注意题目中要求的不能相邻是指不能按原顺序相邻,即$s1$中有$ab$但$s2$中可以有$ba$。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int mod=1000000007;
struct lty
{
int a[27][27];
lty(){memset(a,0,sizeof(a));}
lty operator *(const lty &x)const
{
lty res=lty();
for(int i=1;i<=26;i++)
{
for(int j=1;j<=26;j++)
{
for(int k=1;k<=26;k++)
{
res.a[i][j]=(res.a[i][j]+1ll*a[i][k]*x.a[k][j]%mod)%mod;
}
}
}
return res;
}
};
int vis[27][27];
char s[100010];
ll n;
lty ans;
lty quick(ll n)
{
lty s=lty();
for(int i=1;i<=26;i++)
{
s.a[i][i]=1;
}
while(n)
{
if(n&1)
{
s=s*ans;
}
n>>=1;
ans=ans*ans;
}
return s;
}
int main()
{
scanf("%lld",&n);
scanf("%s",s+1);
int len=strlen(s+1);
for(int i=2;i<=len;i++)
{
vis[s[i-1]-'a'+1][s[i]-'a'+1]=1;
}
for(int i=1;i<=26;i++)
{
for(int j=1;j<=26;j++)
{
ans.a[i][j]=1-vis[i][j];
}
}
lty res=quick(n-1);
int ret=0;
for(int i=1;i<=26;i++)
{
for(int j=1;j<=26;j++)
{
ret=(ret+res.a[i][j])%mod;
}
}
printf("%d",ret);
}

[TJOI2019]甲苯先生的字符串——矩阵乘法+递推的更多相关文章

  1. BZOJ 5508: [Tjoi2019]甲苯先生的字符串 矩阵乘法_思维

    求 $f[i][j]=∑f[i−1][k]$,$'a'<=k<='z'$ . 用矩阵乘法转移一波即可. 竟然独自想出来了QAQ Code: #include <bits/stdc++ ...

  2. HDU 4914 Linear recursive sequence(矩阵乘法递推的优化)

    题解见X姐的论文 矩阵乘法递推的优化.仅仅是mark一下. .

  3. 【BZOJ-2476】战场的数目 矩阵乘法 + 递推

    2476: 战场的数目 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 58  Solved: 38[Submit][Status][Discuss] D ...

  4. 【BZOJ-4547】小奇的集合 矩阵乘法 + 递推

    4547: Hdu5171 小奇的集合 Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: 175  Solved: 85[Submit][Status][D ...

  5. Luogu 1962 斐波那契数列(矩阵,递推)

    Luogu 1962 斐波那契数列(矩阵,递推) Description 大家都知道,斐波那契数列是满足如下性质的一个数列: f(1) = 1 f(2) = 1 f(n) = f(n-1) + f(n ...

  6. Ipad,IPhone(矩阵求递推项+欧拉定理)

    Ipad,IPhone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...

  7. luogu题解 P1707 【刷题比赛】矩阵加速递推

    题目链接: https://www.luogu.org/problemnew/show/P1707 分析: 洛谷的一道原创题,对于练习矩阵加速递推非常不错. 首先我们看一下递推式: \(a[k+2]= ...

  8. UVA 11464 偶数矩阵(递推 | 进制)

    题目链接:https://vjudge.net/problem/UVA-11464 一道比较好的题目. 思路如下: 如果我们枚举每一个数字“变”还是“不变”,那么需要枚举$2^{255}$种情况,很显 ...

  9. 牛客练习赛63 牛牛的斐波那契字符串 矩阵乘法 KMP

    LINK:牛牛的斐波那契字符串 虽然sb的事实没有改变 但是 也不会改变. 赛时 看了E和F题 都不咋会写 所以弃疗了. 中午又看了一遍F 发现很水 差分了一下就过了. 这是下午和古队长讨论+看题解的 ...

随机推荐

  1. tree 树形加载及增删改

    //异步1<template> <div class="addequipment org"> <div class="top"&g ...

  2. java ajax上传文件

    包括案例 1.springmvc上传 2.ajax上传 3.form表单与文件上传 - 1. http://localhost:8080/ 第一种:springmvc上传- 2. http://loc ...

  3. oracle的LAST_DAY()函数

    转自:https://blog.csdn.net/u012581453/article/details/53727936 LAST_DAY LAST_DAY函数返回指定日期对应月份的最后一天. 获取当 ...

  4. Python中with用法详解

    一 .with语句的原理 上下文管理协议(Context Management Protocol):包含方法 __enter__()和__exit__(),支持该协议的对象要实现这两个方法. 上下文管 ...

  5. Chrome安装crx文件的插件时出现“程序包无效”

    有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python   https://www.cnblogs.com/xxtalhr/p/11043453.html 链接:https: ...

  6. IO模型之NIO代码及其实践详解

    一.简介 NIO我们一般认为是New I/O(也是官方的叫法),因为它是相对于老的I/O类库新增的( JDK 1.4中的java.nio.*包中引入新的Java I/O库).但现在都称之为Non-bl ...

  7. 修改tomcat使用的的编码方式

    默认情况下,tomcat使用的的编码方式:iso8859-1 修改tomcat下的conf/server.xml文件 找到如下代码:    < Connector port="8080 ...

  8. Python面向对象之进阶

    一.property 内置函数 装饰器的使用:所有的装饰器函数.方法.类的上一行直接@装饰器的名字 装饰器的分类: ① 装饰函数 ② 装饰方法 ③ 装饰类 property 是一个装饰器函数 @pro ...

  9. C++——友元 friend

    人类社会的friend VS C++世界的friend 现实世界中,我们自己很多物品,朋友是可以使用的,但是陌生人就不行.那么money,朋友可以随便拿吗?这要是你和friend的关系深浅而定.人类社 ...

  10. Python将字符串转换成字典

    1. ast包 import ast user_info = '{"name" : "南湖", "gender" : "male& ...