首先定义状态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 }

最新文章

  1. ng-repeat 里 使用ng-show ng-hide出现闪动
  2. 随便选择两个城市作为预选旅游目标。实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市。分别用Runnable接口和Thread类实现。
  3. Unity5.x版本AssetBundle加载研究
  4. create thread的时候发生core dump
  5. NOIP2013 题解
  6. Socket简介
  7. Git工作流
  8. WCF Membership and Role Provider
  9. 男装电商Bonobos融资5500万美元,计划IPO,全靠体验店战略 - 国外 - 快鲤鱼
  10. 使用Chrome DevTools的Timeline和Profiles提高Web应用程序的性能
  11. 180114 用装饰器实现在不改变函数调用者的代码基础上,实现在函数执行前后分别打印&quot;before&quot; 和 &quot;after&quot;
  12. c#用winform开发一个简易双色球项目
  13. php一次性大量数据入库解决方法
  14. Matlab Gauss quadrature
  15. Ansible--原理
  16. 关于EXCEL if、countif 在查找数据的用法
  17. abap对象的创建和调用。方法调用
  18. 003-RHEL7-Linux系统维护管理命令使用
  19. 常见的web安全及防护原理
  20. 【生产问题】LDF丢失

热门文章

  1. NET5 EF Core添加EF生成SQL日志记录
  2. 这几种Java异常处理方法,你会吗?
  3. git 更新与图形界面
  4. 微软Windows11安卓子系统已支持运行APK 应用(附手把手详细安装攻略)怎么安装安卓/如何安装安卓应用/支持多窗口多任务
  5. 40个Python入门小程序
  6. Beta-功能规格说明书
  7. 热身训练3 Palindrome
  8. DMA实现采样数据的直接搬运存储
  9. 攻防世界 web3.backup
  10. EasyX安装教程