好老的题了啊..
用fi,j表示当前串的长度为i,已经匹配了
#include<iostream>
#include<cstdio>
#include<cstring>
#define M 25
using namespace std;
int n,m,sum,MOD;
char s[M];
int p[M];
struct Matrix
{
long long a[M][M];
Matrix()
{
memset(a,0,sizeof(a));
}
friend Matrix operator*(Matrix a,Matrix b)
{
Matrix ans;
for (int i=0;i<m;i++)
for (int j=0;j<m;j++)
for (int k=0;k<m;k++)
(ans.a[i][j]+=a.a[i][k]*b.a[k][j])%=MOD;
return ans;
}
friend Matrix operator^(Matrix a,long long b)
{
Matrix ans;
for (int i=0;i<m;i++) ans.a[i][i]=1;
for (;b;b>>=1,a=a*a)
if (b&1) ans=ans*a;
return ans;
}
}a,ans;
inline void kmp()
{
int j=0; p[1]=0;
for (int i=2;i<=m;i++)
{
while (j&&s[j+1]!=s[i]) j=p[j];
if (s[j+1]==s[i]) j++;
p[i]=j;
}
for (int i=0;i<m;i++)
for (int j=0;j<=9;j++)
{
int x=i;
while (x&&s[x+1]-'0'!=j) x=p[x];
if (s[x+1]-'0'==j) a.a[i][x+1]++;
else a.a[i][0]++;
}
}
int main()
{
scanf("%d%d%d",&n,&m,&MOD);
scanf("%s",s+1);
kmp();
ans=a^n;
for (int i=0;i<m;i++) (sum+=ans.a[0][i])%=MOD;
cout << sum << endl;
return 0;
}
本文介绍了一种利用KMP算法结合矩阵快速幂的方法解决字符串匹配问题的技术方案。通过预处理构建状态转移矩阵,并利用快速幂优化多次状态转移的过程,最终高效地计算出所有可能的匹配情况。

被折叠的 条评论
为什么被折叠?



