玄关球条
查看原帖
玄关球条
1419569
Z_kazuha楼主2024/11/6 14:17
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+7;
struct node{
	int fail,son[27],end;
}trie[N];
int n,cnt=1,fa[N];	
void insert(string s){
	int u=1;
	for(int i=0;i<s.size();i++){
		int v=s[i]-'A';
		if(!trie[u].son[v])trie[u].son[v]=++cnt;
		u=trie[u].son[v];
	//	cout<<u<<endl;
	}
	trie[u].end=1;
}
queue<int> q;
void getfail(){
	for(int i=0;i<=25;i++)trie[0].son[i]=1;
	q.push(1);trie[1].fail=0;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=0;i<=25;i++){
			if(!trie[u].son[i])trie[u].son[i]=trie[trie[u].fail].son[i];
			else{
				q.push(trie[u].son[i]);
				trie[trie[u].son[i]].fail=trie[trie[u].fail].son[i];
				//if(trie[trie[trie[u].fail].son[i]].end)trie[trie[u].son[i]].end=1;
				//trie[trie[u].son[i]].end|=trie[trie[trie[u].son[i]].fail].end;

			}
			cout<<trie[u].son[i]<<endl;
		}
	}
}
int vis[N];
int dp[N][N];
int m;
int qpow(int a,int b){
	int ans=1;
	while(b){
		if(b%2==1){
			ans=ans*a%N;
		}
		a=a*a%N;
		b>>=1;
	}
	return ans;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		string s;
		cin>>s;
		insert(s);
	}
	getfail();	
	dp[0][1]=1;
	for(int i=1;i<=m;i++){
		for(int d=1;d<=cnt;d++){
			for(int j=0;j<=25;j++){
				if(!trie[trie[d].son[j]].end){
					dp[i][trie[d].son[j]]=(dp[i][trie[d].son[j]]+dp[i-1][j])%N;
				//	cout<<i<<" "<<trie[d].son[j]<<" "<<dp[i][trie[d].son[j]];
				}
			}
		}
	}
	int ans=qpow(26,m);
	int sum=0;
	for (int i=1;i<=cnt;i++)(sum+=dp[m][i])%=N;
	cout<<(ans-sum+N)%N;
	return 0;
}
2024/11/6 14:17
加载中...