[bzoj5508]甲苯先生的字符串

[bzoj5508]甲苯先生的字符串,第1张

概述首先定义状态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 struc

首先定义状态f[i][j]表示长度为i的串以j为结尾有多少符合条件的串,发现$f[i][j]=\sum f[i-1][k]$(jk可以相邻),这个用矩阵乘法优化一下即可。

 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 }
VIEw Code @H_251_301@ 总结

以上是内存溢出为你收集整理的[bzoj5508]甲苯先生的字符串全部内容,希望文章能够帮你解决[bzoj5508]甲苯先生的字符串所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1222958.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存