20分求条悬1关
查看原帖
20分求条悬1关
941575
Stars_visitor_tyw楼主2025/8/2 22:56
#include<bits/stdc++.h>
 #define int long long
using namespace std;
const int mod=1e9+7;
int n, k, tot=0, trie[20005][5], exist[20005], dp[20005][5], siz[20005];
vector<int> nbr[20005];
int get_num(char ch)
{
	if(ch=='l')return 1;
	if(ch=='q')return 2;
	if(ch=='b')return 3;
}
void insert(string s)
{
	int cur=0;
	for(int i=0;i<s.size();i++)
	{
		int ch=get_num(s[i]);
		if(trie[cur][ch]==0)
		{
			trie[cur][ch]=++tot;
		}
//		cout<<"iakioi\n";
//		cout<<cur<<" "<<trie[cur][ch]<<"\n";
		nbr[cur].push_back(trie[cur][ch]);
		cur=trie[cur][ch];
	}
}
void dfs(int cur)
{
	dp[cur][1]=1;
	siz[cur]=1;
	for(int nxt:nbr[cur])
	{
		dfs(nxt);
		siz[cur]+=siz[nxt];
//		cout<<"abcd\n";
		for(int j=min(siz[cur],k);j>=0;j--)
		{
//			dp[cur][j]=0;
//			cout<<"jfdfjed\n";
			for(int p=0;p<=min(j,siz[nxt]);p++)
			{
//				cout<<nxt<<" "<<p<<" "<<dp[nxt][p]<<"\n";
				dp[cur][j]=(dp[cur][j]%mod+dp[cur][j-p]*dp[nxt][p]%mod)%mod;
//				cout<<dp[cur][j]<<" ";
			}
		}
	}
//	dp[cur][1]++;
}
signed main()
{
	ios::sync_with_stdio(0),cin.tie(0);
//	for(int i=0;i<=20004;i++)siz[i]=1;
//	memset(trie,-1,sizeof trie);
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		string s;
		cin>>s;
		insert(s);
	}
//	cout<<tot<<"\n";
	dfs(0);
	cout<<dp[0][k]%mod;
}
2025/8/2 22:56
加载中...