首页 > 其他分享 >[JSOI2007]文本生成器【AC自动机+DP】

[JSOI2007]文本生成器【AC自动机+DP】

时间:2022-08-23 01:22:18浏览次数:90  
标签:AC ch JSOI2007 int 生成器 long ans fail

下定决心想要将这份爱意传达给你,与你在一起的每一刻总是那么值得珍藏,
你的存在左右着我的思绪,实在是不想错过这样的美好,
真的不和我在一起吗?
image

我的学术生涯,虽然有点奇妙,嗯,果然是开始了。导师是个副教授,叫我写\(vue\),嗯,也没问题,除了我一点也不会写\(vue\)之外。我从知网上下载他所有的论文时,忽然灵魂出窍灵光一现,想到一个海王见了都傻眼的点子。我的想法很大胆,我最近一直很大胆,不是不怕失败,不怕闯祸,不怕颜面尽失……只是,我渐渐明白了,只有肯在泥潭里打滚的野猪才能找到橡果。明天的任务就清晰了,一是学习\(vue\),二是研读手上的论文,三,最重要的,要给那几位教授发邮件轰炸了。我能预见我费心费力写的邮件可能被本校老师当做笑柄谈资,可能被外校老师一键删除,可是,我能预见,再也没有什么能阻止我了,就像我在开学前就加入\(ACM\)校队,就像我在军训前夕跌跌撞撞求加项目,就像我到武汉后就没有吃上一顿午饭,就像这个凌晨两点睡六点五十起床的日常……看吧,没有什么能阻止我。至于算法竞赛,我发现不觉间已更接近于深夜一种消遣了吧,就像春梦中的呓语。主动去追逐缥缈幻影里的鸿光吧,犯错的成本会越来越高的。标记好每个串的结尾点,跑AC自动机上按长度和节点方向\(DP\),求出不合法的情况数后容斥即可。

$click$ $for$ $codes$
# include "bits/stdc++.h"
using namespace std;
constexpr int N = 6003;
constexpr int mod = 1e4 + 7;
long long Pow(int x, int y) {
	long long ans = 1;
	for(; y; y >>= 1, x = 1ll * x * x % mod) if(y & 1) ans = ans * x % mod;
	return ans;
}
char str[N];
bool flag[N];
int ch[N][26], trie_index, fail[N];
struct Ahio_Corasick_Automation {
	void insert(char *str) {
		int len = strlen(str + 1), u = 0;
		for(int i = 1; i <= len; ++i) {
			int v = str[i] - 'A';
			if(!ch[u][v]) ch[u][v] = ++trie_index;
			u = ch[u][v];
		}
		flag[u] = true; // key 1
	}
	void build() {
		queue<int> q;
		for(int i = 0; i < 26; ++i) {
			if(ch[0][i]) {
				q.push(ch[0][i]);
			}
		}
		while(!q.empty()) {
			int u = q.front();
			q.pop();
			for(int i = 0; i < 26; ++i) {
				if(ch[u][i]) {
					fail[ch[u][i]] = ch[fail[u]][i];
					q.push(ch[u][i]);
					flag[ch[u][i]] |= flag[fail[ch[u][i]]]; // key 2
				} else {
					ch[u][i] = ch[fail[u]][i];
				}
			}
		}
	}
} AC;
long long f[N][N];
int main() {
	int n, m;
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; ++i) {
		scanf("%s", str + 1);
		AC.insert(str);
	}
	AC.build();

	f[0][0] = 1; // key 3 // to assure length 1 -> val 1
	for(int i = 1; i <= m; ++i) {
		for(int j = 0; j <= trie_index; ++j) {
			if(flag[j]) continue;
			for(int k = 0; k < 26; ++k) {
				f[i][ch[j][k]] = (f[i][ch[j][k]] + f[i - 1][j]) % mod;
			}
		}
	}
	long long ans = Pow(26, m);
	for(int i = 0; i <= trie_index; ++i) {
		if(flag[i]) continue;
		ans = (ans - f[m][i] + mod) % mod;
	}
	printf("%lld", ans);
	return 0;
}

image

标签:AC,ch,JSOI2007,int,生成器,long,ans,fail
From: https://www.cnblogs.com/bingoyes/p/16614777.html

相关文章

  • PlantUML 安装与使用(Mac/Idea)
    1.安装确保本机可以使用brew指令brewinstallgraphviz出现以上提示去Homebrew官网:https://brew.sh/index_zh-cn先安装macOS(或Linux)缺失的软件包的管理器,若......
  • ubuntu20.04虚拟机最小化安装(legacy server+xfce4,装完只有3G)
    server自己配桌面,可以最小化安装。legacyserver比liveserver更小,虚拟机用来部署编译环境最好了。其实还有更小的ubuntu-base版,但是那个安装配置太麻烦了。 1.下载ub......
  • react三大核心之一props
    -html标签可以在标签上写自定义属性,那么react的组件,也可以像传属性一项,给组件传props;react组件接收到传入的属性后,会自动塞进实例的props属性中,通过this.props可以拿到外......
  • React报错之React Hook 'useEffect' is called in function
    正文从这开始~总览为了解决错误"ReactHook'useEffect'iscalledinfunctionthatisneitheraReactfunctioncomponentnoracustomReactHookfunction",可以将......
  • 实现最简单的 React DOM Diff 算法
    实现最简单的ReactDOMDiff算法本文写于2022年08月22日定义VNode与VNodeList类型首先我们定义一个简单的VNode类型。typeFlag="Placement"|"Delet......
  • Docke 搭建 apache2 + php8 + MySQL8 环境
    Docker安装执行Docker安装命令curl-fsSLhttps://get.docker.com/|sh启动Docker服务sudoservicedockerstart查看Docker是否正常工作sudo......
  • RBAC权限模型:控制不同用户的菜单权限
    RBAC权限模型控制不同用户的菜单权限:权限:权限,是用户可以访问的资源。包括页面权限、操作权限和数据权限。页面权限:页面权限,即用户登录系统可以看到的页面。由菜单控制......
  • oracle时间对比报错:ORA-01861 文字与格式字符串不匹配
    前段时间写一个简单的需求时碰到的,在使用传入的时间参数与oracle数据库里存的时间进行比较时报错,具体错误如下:   在Oracle中,需要使用to_date格式化时间,再进行对比......
  • 使用foreach 实现sql 拼接
    有时候写sql时,需要根据传入的参数构建sql语句,实现遍历集合,构建in条件语句或者批量操作语句,此时可以使用foreach实现对sql的拼接。下面是foreach标签的各个属性属性......
  • 手写实现react hooks
    实现一些简单的reacthooks........在钩子函数中不要使用if判断,避免钩子错乱建立数组映射,建立多组钩子初始化数组和索引,全局使用lethookIndex=0lethookState=[......