Solution
2023-07-18 14:42:07
发布于:广东
6阅读
0回复
0点赞
#include <cstdio>
const int N=5e3+5;
const int mod=1e9+7;
int n,m,k,l[N],c[N],f[N][N],g[N],cnt[26];
void upd(int &x,int y) {
(x+=y)>=mod&&(x-=mod);
}
char getc() {
char c=getchar();
while(c<'A'||c>'Z') c=getchar();
return c;
}
int pow(int x,int p) {
int ans=1;
for(;p;p>>=1,x=1LL*x*x%mod) if(p&1) ans=1LL*ans*x%mod;
return ans;
}
int main() {
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;++i) scanf("%d%d",&l[i],&c[i]);
g[0]=1;
for(int i=1;i<=k;++i) {
for(int j=1;j<=n;++j) if(i>=l[j]) upd(f[i][c[j]],g[i-l[j]]);
for(int j=1;j<=n;++j) upd(g[i],f[i][j]);
}
for(int i=1;i<=m;++i) ++cnt[getc()-'A'];
int ans=1;
for(int i=0;i<26;++i) if(cnt[i]) {
int sum=0;
for(int j=1;j<=n;++j) upd(sum,pow(f[k][j],cnt[i]));
ans=1LL*ans*sum%mod;
}
printf("%d\n",ans);
return 0;
}
这里空空如也
有帮助,赞一个