首页 > 其他分享 >UVA-1401 - Remember the Word -----Trie前缀树

UVA-1401 - Remember the Word -----Trie前缀树

时间:2023-09-12 12:35:27浏览次数:37  
标签:ch Word Remember Trie maxnode 单词 int include 节点


题意:给出N个不同单词和一个长字符串S。把这个字符串分解成若干个单词的连接(单词尅重复使用),问有多少种方法?

分析:令d[i]表示从字符i开始的字符串的分解方案数,则d[i]=sum{d[i+len[x]] | 单词x是S[i...len]的前缀};


详看《算法竞赛入门经典》---刘汝佳--Page 208..


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
using namespace std;


#define sigma_size 26     
#define maxnode 400010    //节点个数
#define MOD 20071027

struct Trie//Trie模板
{
	int ch[maxnode][sigma_size];//maxnode表示节点个数,每个节点有26种情况,所以ch数组能表示所有情况
	int val[maxnode];           //存节点的信息
	int sz;                     //节点总个数
	void clear(){sz=1; memset(ch[0],0,sizeof(ch[0]));}//初始化
	int idx(char c){ return c - 'a'; }

	void insert(char *s, int v)
	{
		int u=0,n=strlen(s);
		for(int i=0;i<n;i++){
			int c=idx(s[i]);
			if(!ch[u][c]){ //节点不存在
				memset(ch[sz],0,sizeof(ch[sz]));
				val[sz]=0;
				ch[u][c]=sz++;
			}
			u=ch[u][c];//这样存就可以保证从每个节点,都能访问他的下一个节点了
		}
		val[u]=v;
	}

	void find(char *s,int len,vector<int>& ans)
	{
		int u=0;
		for(int i=0;i<len;i++)
		{
			
			int c=idx(s[i]);
			if(ch[u][c]){
				u=ch[u][c];
				if(val[u])
					ans.push_back(val[u]);
			}
			else
				break;
		}
	}
};


Trie node;

char sh[300010];
int d[4005];
int sum[300010];
int main()
{
	int i=0,j,k;
	int t=0;
	while(~scanf("%s",sh))
	{
		t++;
		int n;
		node.clear();
		char p[105];
		scanf("%d",&n);
		for(i=1;i<=n;i++){
			scanf("%s",p);
			node.insert(p,i);
			d[i]=strlen(p);
		}
		int len=strlen(sh);
		memset(sum,0,sizeof(sum));
		sum[len]=1;
		for(i=len-1;i>=0;i--){
			
			vector<int> ans;
			node.find(sh+i,len-i,ans);
			for(j=0;j<ans.size();j++)
			{
				sum[i]=(sum[i]+sum[i+d[ans[j]]])%MOD;
			}
		}
		printf("Case %d: %d\n",t,sum[0]);
	}
	return 0;
}




标签:ch,Word,Remember,Trie,maxnode,单词,int,include,节点
From: https://blog.51cto.com/u_16244339/7444321

相关文章

  • Python合并不同Word并同时添加多个分页符的方法
      本文介绍基于Python,实现对多个Word文档加以自动合并,并在每次合并时按要求增添一个分页符的方法。  现有多个Word文档文件,需将其按名称顺序合并为一个新的Word文件,且需保证每一次合并时,都另起一页(即新的Word文件一页中,不能出现两个及以上的原本单个Word文件的内容)。  一般......
  • Unity 性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法
    Unity性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法点击封面跳转下载页面简介Unity性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法在Unity开发中,性能优化是一个非常重要的方面。一个常见的性能优化技巧是使用ShaderUtil.GetSha......
  • Unity 性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法
    Unity性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法点击封面跳转下载页面简介Unity性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法在Unity开发中,性能优化是一个非常重要的方面。一个常见的性能优化技巧是使用ShaderUtil.GetSh......
  • nopi 2.6.1 读word docx,写Excel xsls 源代码例子
    ///<summary>///获取.docx文件内容,使用NPOI.XWPF插件解析///</summary>///<paramname="strFilePath">文件路径</param>///<returns></returns>publicstringGetDocxContent(stri......
  • vue 页面导出为pdf与word
    vue页面导出为pdf与word一.导出为word 基于 docxtemplater 来导出word文档的方法1.安装引用依赖//安装docxtemplaternpminstalldocxtemplaterpizzip--save//安装jszip-utilsnpminstalljszip-utils--save//安装jszipnpminstalljszip--save//安装......
  • Spring Boot 中使用 Poi-tl 渲染数据并生成 Word 文档
    本文Demo已收录到demo-for-all-in-java项目中,欢迎大家star支持!后续将持续更新!前言产品经理急冲冲地走了过来。「现在需要将按这些数据生成一个Word报告文档,你来安排下」项目中有这么一个需求,需要将用户填写的数据填充到一个Word文档中,而这个Word文档是人家给定......
  • John:No password hashes left to crack (see FAQ)
    使用john--wordlist=/usr/share/wordlists/rockyou.txt文件名出现:Usingdefaultinputencoding:UTF-8Loaded1passwordhash(netntlmv2,NTLMv2C/R[MD4HMAC-MD532/64])Nopasswordhasheslefttocrack(seeFAQ)说明该文件已经被破解过,结果存放在john.pot中......
  • 完美解决Python词云库wordcloud不显示中文问题
    你的Python词云库wordcloud显示的都是方框吗?别担心,我有一个妙招让你的中文词云变得美观又清晰!背景:wordcloud是一个基于python的词云生成库,它可以让你用简单的代码创建出各种形状和颜色的词云图像wordcloudgithub地址:https://github.com/amueller/word_cloudwordcloud\(\color......
  • 【Sword系列】第七届全国残疾人职业技能大赛样题-网络安全-疑惑的汉字
    (文章目录)前言当铺密码通常使用汉字来隐藏信息,专门用来加密数字,不需要密钥,明文信息包含在加密后的密文中。较常见的当铺密码有两种,一种是将数字映射到对应笔画的汉字,另外一种是利用汉字的字形特征,当前汉字有多少笔画出头就转化成数字几。一、疑惑的汉字1.打开题目2.解题......
  • 致远 resetPassword 任意密码重置
    一级sdasd一级撒打算打算的二级阿斯顿撒的撒打算大三级撒打算三级收纳斤斤计较斤斤计较四级四十几岁就死手机死机死机啊大叔......