P4591
这这这不是 DP 吗?
题目大意:一个蛋白质,由
用
判断是否相等可以用hash维护,时间复杂度为
最后输出
Code
#include<bits/stdc++.h>
#define ll long long
#define Mod (1000000007)
#define q (27)
using namespace std;
ll ned[10005]={1};
ll n, a, m, k, len;
string s;
ll hsh[10005], tmp, dp[105][10005], sum=0;
int main()
{
cin>>k>>s;
n=s.size();
for(ll i=0;i<=n;i++){
dp[0][i]=1;
}
for(ll i=0;i<n;i++){
hsh[i+1]=(hsh[i]*q+s[i])%Mod;
ned[i+1]=ned[i]*q%Mod;
}
for(ll i=1;i<=k;i++){
cin>>a;
for(int null_help=1;null_help<=a;null_help++){
cin>>s;
len=s.size(), tmp=0;
for(ll j=0;j<len;j++){
tmp=(tmp*q+s[j])%Mod;
}
for(ll l=0, r=len;r<=n;l++, r++){
if(((hsh[r]-hsh[l]*ned[len]%Mod)%Mod+Mod)%Mod!=tmp) continue;
dp[i][r]=(dp[i][r]+dp[i-1][l])%Mod;
}
}
}
for(ll i=1;i<=n;i++){
sum=(sum+dp[k][i])%Mod;
}
cout<<sum;
return 0;
}