EOJ 3261 分词

字典树,$dp$。

记录$dp[i]$为以$i$为结尾获得的最大价值。枚举结尾一段是哪个单词,更新最大值。可以将字典中单词倒着建一棵字典树。

这题数据有点不严谨。

下面这组数据答案应该是负的。

3

a 0.1

aa 0.1

aaa 0.1

1

aaa

下面这组数据没通过的代码在$OJ$上也可以$AC$......

3

a 2

aa 2

aaa 2

1

aaab

正确答案是:

6.238325

aaa b

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;

double eps = 1e-7;

struct X
{
	double f;
	int nx[26];
}s[300010];
int sz=0,root=0;

int n,T;
char t[5010];
char tt[5010];
double w;

double dp[5010];
int pre[5010];

int r[5010];

void Insert()
{
	int p = root;
	int len = strlen(t);
	for(int i=len-1 ; i>=0 ;i--)
	{
		if(t[i]>=‘A‘&&t[i]<=‘Z‘) t[i] = t[i] -‘A‘ + ‘a‘;
		if(s[p].nx[t[i]-‘a‘]==-1) s[p].nx[t[i]-‘a‘] = ++sz;
		p = s[p].nx[t[i]-‘a‘];
	}
	s[p].f = w;
}

double get(int x)
{
	if(x<0) return 0.0;
	return dp[x];
}

double work(double x)
{
	if(x==0.0) return 0.0;
	return log(x);
}

int main()
{
	scanf("%d",&n);

	for(int i=0;i<=300005;i++)
	{
		s[i].f = 0;
		for(int j=0;j<=25;j++) s[i].nx[j] = -1;
	}

	sz=0;

	for(int i=1;i<=n;i++)
	{
		scanf("%s%lf",t,&w);
		Insert();
	}

	scanf("%d",&T);
	while(T--)
	{
		scanf("%s",t); tt[0]=0; strcpy(tt,t);
		int len = strlen(t);

		for(int i=0;i<len;i++)
		{
			if(t[i]>=‘A‘&&t[i]<=‘Z‘)
				t[i] = t[i] - ‘A‘ +‘a‘;
		}

		memset(dp,0,sizeof dp);
		memset(pre,-1,sizeof pre);

		for(int i=0;i<len;i++)
		{
			int now = i, p = root;

			while(1)
			{
				if(now<0) break;
				if(s[p].nx[t[now]-‘a‘]==-1)
				{
					for(int e=0;e<now;e++)
					{
						if(dp[i] < dp[e])
						{
							dp[i] = dp[e];
							pre[i] = e;
						}
					}
					break;
				}
				p = s[p].nx[t[now]-‘a‘];

				if(get(now-1) + work(s[p].f)*(i-now+1)*(i-now+1) > dp[i])
				{
					dp[i] = get(now-1) + work(s[p].f)*(i-now+1)*(i-now+1);
					pre[i] = now-1;
				}

				now--;
			}
		}

		printf("%.6f\n",dp[len-1]);

		memset(r,0,sizeof r);

		int pp = pre[len-1];

		while(1)
		{
			if(pp<0) break;
			r[pp]=1;
			pp = pre[pp];
		}

		for(int i=0;i<len;i++)
		{
			printf("%c",tt[i]);
			if(r[i]) printf(" ");
		}
		printf("\n");

	}

	return 0;
}
时间: 2025-01-02 02:46:28

EOJ 3261 分词的相关文章

lucene分词器中的Analyzer,TokenStream, Tokenizer, TokenFilter

分词器的核心类: Analyzer:分词器 TokenStream: 分词器做好处理之后得到的一个流.这个流中存储了分词的各种信息,可以通过TokenStream有效的获取到分词单元. 以下是把文件流转换成分词流(TokenStream)的过程 首先,通过Tokenizer来进行分词,不同分词器有着不同的Tokenzier,Tokenzier分完词后,通过TokenFilter对已经分好词的数据进行过滤,比如停止词.过滤完之后,把所有的数据组合成一个TokenStream:以下这图就是把一个re

PHP中文分词扩展 SCWS

1.scws简介 SCWS 是 Simple Chinese Word Segmentation 的首字母缩写(即:简易中文分词系统). 这是一套基于词频词典的机械式中文分词引擎,它能将一整段的中文文本基本正确地切分成词. 词是中文的最小语素单位,但在书写时并不像英语会在词之间用空格分开, 所以如何准确并快速分词一直是中文分词的攻关难点. SCWS 采用纯 C 语言开发,不依赖任何外部库函数,可直接使用动态链接库嵌入应用程序, 支持的中文编码包括 GBK.UTF-8 等.此外还提供了 PHP 扩

Elasticsearch安装中文分词插件ik

Elasticsearch默认提供的分词器,会把每个汉字分开,而不是我们想要的根据关键词来分词.例如: curl -XPOST "http://localhost:9200/userinfo/_analyze?analyzer=standard&pretty=true&text=我是中国人" 我们会得到这样的结果: { tokens: [ { token: text start_offset: 2 end_offset: 6 type: <ALPHANUM>

中文分词实践(基于R语言)

背景:分析用户在世界杯期间讨论最多的话题. 思路:把用户关于世界杯的帖子拉下来,然后做中文分词+词频统计,最后将统计结果简单做个标签云,效果如下: 后续:中文分词是中文信息处理的基础,分词之后,其实还有特别多有趣的文本挖掘工作可以做,也是个知识发现的过程,以后有机会再学习下. ================================================== * 中文分词常用实现: 单机:R语言+Rwordseg分词包 (建议数据量<1G) 分布式:Hadoop+Smallse

中文分词之结巴分词~~~附使用场景+demo

常用技能(更新ing):http://www.cnblogs.com/dunitian/p/4822808.html#skill 技能总纲(更新ing):http://www.cnblogs.com/dunitian/p/5493793.html 在线演示:http://cppjieba-webdemo.herokuapp.com 完整demo:https://github.com/dunitian/TempCode/tree/master/2016-09-05 先说下注意点,结巴分词他没有对分

IK分词器 整合solr4.7 含同义词、切分词、停止词

IK分词器如果配置成 <fieldType name="text_ik" class="solr.TextField"> <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/> <analyzer type="query" is

NLP之CRF分词训练(六)

分三步1.先分词2.做BEMS标注,同时做词性标注3.训练模型 1.对语料进行分词 拿到测试部的语料或者其他渠道的语料,先对语料进行分词,我刚刚开始是用NS分词的,等CRF模型训练好后,可以直接用CRF进行分词,分完词后要人工核对分词结果,将分词分得不正确的地方修改好 2.标注词性,标注BEMS BEMS所说是中科院的提出一种标注,也有说BEIS的,hanlp用的是BEMSB:开始E:结束M/I:中间 S:单独BEMS标注已经写了一个方法generateCRF在SegAndSave.class中

python jieba分词工具

源码地址:https://github.com/fxsjy/jieba 演示地址:http://jiebademo.ap01.aws.af.cm/ 特点 1,支持三种分词模式: a,精确模式,试图将句子最精确地切开,适合文本分析:     b,全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义:     c,搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词. 2,支持繁体分词 3,支持自定义词典 安装 1,Python 2.x 下的安

php+中文分词scws+sphinx+mysql打造千万级数据全文搜索

Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎.意图为其他应用提供高速.低空间占用.高结果 相关度的全文搜索功能.Sphinx可以非常容易的与SQL数据库和脚本语言集成.当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式 的XML数据.Sphinx创建索引的速度为:创建100万条记录的索引只需3-4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒.Sphinx的