社区讨论

大佬求调

P4052[JSOI2007] 文本生成器参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mi9qoy8m
此快照首次捕获于
2025/11/22 11:38
3 个月前
此快照最后确认于
2025/11/22 13:09
3 个月前
查看原帖
只对了2,3,4这三个点
CPP
#include<bits/stdc++.h>
using namespace std;
int n, m, dp[105][6005], sum;
string s, t;
struct AC{
	int vis[6005], x[6005], a[6005][26], cnt=0;
	void add(string s, int pos=0){
		for(auto i:s){
			if(!a[pos][i-'A']) a[pos][i-'A']=++cnt;
			pos=a[pos][i-'A'];
		}
		vis[pos]=1;
	}
	void bfs(){
		queue<int> q;
		for(int i=0;i<26;i++) if(a[0][i]) q.push(a[0][i]);
		while(q.size()){
			auto t=q.front();
			q.pop();
			for(int i=0;i<26;i++){
				if(a[t][i]){
					x[a[t][i]]=a[x[t]][i];
					vis[a[t][i]]|=vis[x[a[t][i]]];
					q.push(a[t][i]);
				}
				else a[t][i]=a[x[t]][i];
			}
		}
	}
}ac;
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>s;
		ac.add(s);
	}
	ac.bfs();
	dp[0][0]=1;
	for(int i=0;i<m;i++){
		for(int j=0;j<=ac.cnt;j++){
			if(ac.vis[j]) continue;
			for(int k=0;k<26;k++){
				if(ac.vis[ac.a[j][k]]) continue;
				dp[i+1][ac.a[j][k]]=(dp[i+1][ac.a[j][k]]+dp[i][j])%10007;
			}
		}
	}
	for(int i=0;i<=ac.cnt;i++) sum=(sum+dp[m][i])%10007;
	cout<<(int(pow(26, m))%10007-sum%10007+10007)%10007;
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...