首页 > 其他分享 >[TJOI2019] 甲苯先生的字符串

[TJOI2019] 甲苯先生的字符串

时间:2024-10-14 19:33:12浏览次数:7  
标签:26 const mat int long 字符串 TJOI2019 甲苯 dp

有点水了……

考虑相邻的不能放在一起,不相邻的可以,那么很容易想到转移方程:

\[dp_{i,j}=\sum_{k=0}^{25}dp_{i-1,k}[j,k不相邻] \]

其中 \(dp_{i,j}\) 表示填了 \(i\) 位,最后一位填 \(j\)。

那结合数据范围,显然矩阵快速幂。

时间复杂度 \(O(26^3\log n)\),可以通过

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int p=1e9+7;
struct mat{
	int c[26][26];
	mat(){memset(c,0,sizeof(c));}
}dp,ans;int re;
char s[N];long long n;
mat operator*(mat x,mat y){
	mat z;
	for(int i=0;i<26;i++)
		for(int j=0;j<26;j++)
			for(int k=0;k<26;k++)
				z.c[i][j]=(z.c[i][j]+1ll*x.c[i][k]*y.c[k][j]%p)%p;
	return z;
}mat operator^(mat x,long long y){
	mat z;
	for(int i=0;i<26;i++)
		z.c[i][i]=1;
	while(y){
		if(y&1) z=z*x;
		x=x*x,y>>=1;
	}return z;
}int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>s,n--;
	for(int i=0;i<26;i++)
		for(int j=0;j<26;j++)
			dp.c[i][j]=1;
	for(int i=1;s[i];i++)
		dp.c[s[i-1]-'a'][s[i]-'a']=0;
	for(int i=0;i<26;i++) ans.c[0][i]=1;
	ans=ans*(dp^n);
	for(int i=0;i<26;i++)
		re=(re+ans.c[0][i])%p;
	cout<<re;
	return 0;
} 

标签:26,const,mat,int,long,字符串,TJOI2019,甲苯,dp
From: https://www.cnblogs.com/chang-an-22-lyh/p/18464868/tjoi-the_str_of_mr_jaben-tj

相关文章

  • 洛谷题单指南-字符串-P5283 [十二省联考 2019] 异或粽子
    原题链接:https://www.luogu.com.cn/problem/P5283题意解读:n个整数,每次从从取l~r的数进行异或得到美味值,一共取k次,并计算这k个美味值之和的最大值。解题思路:1、如何O(1)的计算l~r数的异或,得到美味值可以借助前缀和思想,a[i]为第i个数,s[i]表示a[1]~a[i]每个数的异或值,要计算l~r的......
  • js-将JSON 字符串转换为JavaScript 对象(JSON.parse)
    1.背景//JSON字符串constjsonString='{"name":"张三","age":30,"city":"北京"}';获取name值2.JSON字符串进行转换为JS对象将JSON字符串转换为JavaScript对象(JSON.parse(jsonString))//JSON字符串constjsonString='......
  • 字符串
    字符串1转义字符\t(tab)\r(只读后面)2原始字符串s=r'Hell\nworld'->Hell\nworld3文章"""内容"""4字符串转化数字int('20')√int('20.1')×float('20.0')√int('AB')x(10进制无法转化)......
  • 字符函数和字符串函数
                    在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了⼀系列库函数,接下来我们就学习⼀下这些函数。        1.字符分类函数        C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀......
  • [JLOI2015] 有意义的字符串 题解
    看到这个\(7\times10^{18}\)的模数已经可以摆烂了。不是,你告诉我这东西跟矩阵快速幂优化DP有关系??观察到这个题显然不能硬做,因为你显然不能直接算小数部分,而且还有个取模很难受。所以我们希望把一切的计算都基于整数。这个时候我们就要思考,有什么东西可以把根号转化为整数......
  • PTA C语言 7-1 字符串比对 单位 郑州轻工业大学输入两个长度相同的字符串,字符串长度小
    7-1字符串比对分数10作者 zzuli单位 郑州轻工业大学输入两个长度相同的字符串,字符串长度小于20,且只包含英文字符。将两个字符串逐字符对比的结果输出(由+和-构成的一行字符),具体规则如下:如果两个字符串对应字符是同一字母则输出+如果两个字符串对应字符不是同一字母......
  • StringUtils Java字符串工具类
    在我们的代码中经常需要对字符串判空,截取字符串、转换大小写、分隔字符串、比较字符串、拼接字符串、使用正则表达式等等。如果只用String类提供的那些方法,我们需要手写大量的额外代码,不然容易出现各种异常。现在有个好消息是:org.apache.commons.lang3包下的StringUtils工......
  • lazarus新的判断字符串是否为UTF8
    调用IsStringUTF8来判断string是否包含UTF8(中文);procedureTForm1.Button1Click(Sender:TObject);beginifIsStringUTF8(edit1.Text)thenmemo1.Lines.Add(s+'--包含中文')elsememo1.Lines.Add(s+'--包含不中文');end; functionIsStringUTF8(s......
  • HALCON数据结构之字符串
    1.1String字符串的基本操作*将数字转换为字符串或修改字符串*tuple_string(T,Format,String)//HALCON语句*String:=T$Format//赋值操作*Formatstring由以下四个部分组成:*<flags><fieldwidth>.<precision><conversion字符>*1.flags标志*1.1字符'-'*......
  • 每日OJ题_牛客_NC101压缩字符串(一)_模拟_C++_Java
    目录牛客_NC101压缩字符串(一)_模拟题目解析C++代码Java代码牛客_NC101压缩字符串(一)_模拟压缩字符串(一)_牛客题霸_牛客网(nowcoder.com)描述:        利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2bc5a3。......