题解 P5337 【[TJOI2019]甲苯先生的字符串】
有点思维含量的题啊。
虽然作为省选题太套路了。
很显然是
设
很显然的转移式
但是
发现是否可以转移的情况是固定的
可以考虑使用矩阵来判断是否可以转移。
如果字符串
为什么呢?
因为
也就是
就是
正好是矩阵的形式。
由于初始条件下
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define ljc 1000000007
using namespace std;
long long n,m,pr,nf,x;
char s[1000001];
struct matrix{
long long x[27][27];long long sz;
inline void clear(){
for (int i=1;i<=26;i++){
for (int j=1;j<=26;j++){
x[i][j]=0;
}
}
}
}a,one;
inline matrix mul(matrix a,matrix b){
matrix c;
c.clear();c.sz=a.sz;
for (int i=1;i<=26;i++){
for (int j=1;j<=26;j++){
for (int k=1;k<=26;k++){
c.x[i][j]=(c.x[i][j]%ljc+a.x[i][k]%ljc*b.x[k][j]%ljc)%ljc;
}
}
}
return c;
}
inline matrix fast_pow(matrix a,long long b){
matrix t=one;
while (b){
if (b&1LL) t=mul(t,a);
a=mul(a,a);b/=2LL;
}
return t;
}
inline void init_one(){
one.sz=a.sz;
for (int i=1;i<=26;i++){
one.x[i][i]=1;
}
}
int main(){
scanf("%lld",&n);
init_one();
for (int i=1;i<=26;i++){
for (int j=1;j<=26;j++){
a.x[i][j]=1;
}
}
scanf("%s",s+1);
int len=strlen(s+1);
for (int i=2;i<=len;i++){
a.x[s[i-1]-'a'+1][s[i]-'a'+1]=0;
}
a=fast_pow(a,n-1);
long long ans=0;
for (int i=1;i<=26;i++){
for (int j=1;j<=26;j++){
ans=(ans+a.x[i][j])%ljc;
}
}
cout<<ans;
}