BZOJ 1212 HNOI2004 L语言 AC自己主动机(Trie树)+动态规划

BZOJ 1212 HNOI2004 L语言 AC自己主动机(Trie树)+动态规划

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

标题效果:给定词的列表,并m串 每个字符串q个最长前缀,这个前缀可满足拆分成一些字符串 这些字符串中存在的词汇太

再也不怕错误的数据范围……有一个很明显Trie树能解决的问题竟然被我写的AC自己主动机……

单词列表插入所有字AC主动机 每一个单词所在的节点记录这个单词的长度

然后对于每一个字符串 用f[i]表示长度为i的前缀能否拆分成单词表中的单词 跑AC自己主动机

对于每一个匹配的节点 从这个节点開始到根的fail路径上的全部len f[i]|=f[i-len]

找到最大的为1的f[i]即是答案

因为单词长度最大为10 所以直接用Trie树暴力就可以

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 1050000
using namespace std;
struct Trie{
	int len;
	Trie *fail,*son[26];
	void* operator new (size_t size);
}*root,*mempool,*C;
int n,m;
char s[M];
void* Trie :: operator new (size_t size)
{
	if(C==mempool)
	{
		C=new Trie[1<<15];
		mempool=C+(1<<15);
		memset(C,0,sizeof(Trie)*(1<<15) );
	}
	return C++;
}
void Insert(Trie*&p,char *pos,int dpt)
{
	if(!p) p=new Trie;
	if(!*pos)
	{
		p->len=dpt;
		return ;
	}
	Insert(p->son[(*pos)-'a'],pos+1,dpt+1);
}
void BFS()
{
	static Trie* q[1<<16];
	static unsigned short r,h;
	int i;Trie *temp;
	for(i=0;i<26;i++)
		if(temp=root->son[i])
		{
			temp->fail=root;
			q[++r]=temp;
		}
	while(r!=h)
	{
		Trie *p=q[++h];
		for(i=0;i<26;i++)
			if(p->son[i])
			{
				temp=p->fail;
				while( temp!=root && !temp->son[i] )
					temp=temp->fail;
				if( temp->son[i] )
					temp=temp->son[i];
				p->son[i]->fail=temp;
				q[++r]=p->son[i];
			}
	}
}
int Aho_Corasick_Automaton()
{
	int i,re=0;
	Trie *p=root,*temp;
	static bool f[M];f[0]=1;
	for(i=1;s[i];i++)
	{
		f[i]=0;
		while( p!=root && !p->son[s[i]-'a'] )
			p=p->fail;
		if(p->son[s[i]-'a'])
		{
			p=p->son[s[i]-'a'];
			for(temp=p;temp!=root;temp=temp->fail)
				if(temp->len)
				{
					f[i]|=f[i-temp->len];
					if(f[i]) break;
				}
		}
		if(f[i]) re=i;
	}
	return re;
}
int main()
{
	int i;
	cin>>n>>m;
	for(i=1;i<=n;i++)
		scanf("%s",s+1),Insert(root,s+1,0);
	BFS();
	for(i=1;i<=m;i++)
	{
		scanf("%s",s+1);
		cout<<Aho_Corasick_Automaton()<<endl;
	}
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117266.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据库select语句详解

    数据库select语句详解SELECT1.基本语法select*from表名查询这张表所有内容。select列名from表名查询这张表某一列所有内容。select列名1,列名2…from表名查询这张表的列1,列2,等多列。selectdistinct列名from表名查询这一列去掉重复内容后的内容。select表达式from表名查询表达式,下面会详细讲。select列名(表达式)as别名from表名给某一列或表达式取别名。2.例子如下这张表emp:1)检索单个

    2022年6月6日
    40
  • 文本分类——常用经典技术解析(jieba,word2vec,样本不平衡问题)「建议收藏」

    文本分类——常用经典技术解析(jieba,word2vec,样本不平衡问题)「建议收藏」一个文本分类任务的典型操作流程如下:即拿到数据后先分词,然后转化为词向量(数值化过程),最后对数值化后的数据进行分类。一、jieba分词原理jieba自带了一个叫做dict.txt的词典,里面有2万多条词,包含了词条出现的次数(这个次数是于作者自己基于人民日报语料等资源训练得出来的)和词性.这个第一条的trie树结构的词图扫描,说的就是把这2万多条词语,放到一个trie树(词典树…

    2022年9月30日
    2
  • minipcie串口卡_minipcie接口定义图解

    minipcie串口卡_minipcie接口定义图解简介LCminiPCIe系列miniPCIe接口CAN卡,具有1~2路CAN通道和一路PCIExpressmini接口,插到工控机或单板电脑的PCIExpressmini卡槽上,快速扩展出1~2路CAN通道。CAN接口电气隔离高达2500VDC,具有优秀的EMC性能,可靠性测试项目:ESD接触放电8KV、浪涌±1KV、脉冲群±2KV,工业级,通过CE-EMC和FCC认证。配套测试软件L…

    2022年9月8日
    2
  • nv12转rgb「建议收藏」

    nv12转rgb「建议收藏」nv12格式nv12转rgb两种格式代码voidNV12_T_RGB(unsignedintwidth,unsignedintheight,unsignedchar*Y,unsignedchar*UV,unsignedchar*rgb){ intr,g,b; inty,u,v; for(inti=0;i<height;i++){ for(intj=0;j<width;j++){ y=

    2022年9月25日
    3
  • 最全Python学习路线图,21天学会Python!「建议收藏」

    最全Python学习路线图,21天学会Python!「建议收藏」原创最全Python学习路线图,21天学会Python!…

    2022年5月6日
    53
  • PyPDF2的使用「建议收藏」

    PyPDF2的使用「建议收藏」pdf使用Adobe公司开发,现在由国际标准化组织ISO进行维护。PDF合成包含链接和按钮,表单字段,音频,视频和业务逻辑在这篇文章中,我们将学习如何做一些pdf的操作:从PDF中提取文字旋转pdf页合并pdf分割pdf向pdf页中添加水印使用简单的python脚本1、安装我们将使用第三方的模块PyPDF2PyPDF2是作为PDF…

    2022年6月23日
    29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号