HDU4436_str2int
很好的一个题目。对于理解后缀自动机很有用。
题目给你若干数字串,总长度不超过100000,任意一个串的任意一个子串都可以拿出来单独的作为一个数字。同一个数字只算一次。
问所有不同数字的和为多少?
嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯
首先由于字符串的数字很多,我们可以把么多串连接成一个串,每个串用[10]隔开就好了。
然后往后面搜,对于当前状态,保存以这个状态为终点的所有路径的和,每次记录有多少种路径走到当前状态,对于连接x到达的下一个状态就是这样来计算的:f[next[]]+=f[cur]*10+num[]*x;这个式子不难理解。
于是我们把所有的点都拓扑排序一下,然后这样一路计算下去就可以了。(按step值来排序)
有坑提示:注意前导零,注意不能用num是否等于0来判断当前状态能否到达,因为num对2012取模了,所以判断无意义。
召唤代码君:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define maxn 300300
using namespace std; int next[maxn][11],pre[maxn],step[maxn];
int N,last,n,ans;
int p,q,np,nq;
int f[maxn],cnt[maxn],g[maxn],t[maxn];
char s[maxn];
bool mark[maxn]; int add()
{
N++; mark[N]=false;
t[N]=cnt[N]=g[N]=f[N]=pre[N]=step[N]=0;
for (int i=0; i<11; i++) next[N][i]=0;
return N;
} void insert(int x)
{
p=last,np=add(),step[np]=step[last]+1,last=np;
while (p!=-1 && next[p][x]==0) next[p][x]=np,p=pre[p];
if (p==-1) return;
q=next[p][x];
if (step[q]==step[p]+1) { pre[np]=q; return; }
nq=add(),step[nq]=step[p]+1,pre[nq]=pre[q];
for (int i=0; i<11; i++) next[nq][i]=next[q][i];
pre[np]=pre[q]=nq;
while (p!=-1 && next[p][x]==q) next[p][x]=nq,p=pre[p];
} int main()
{
while (scanf("%d",&n)!=EOF)
{
N=-1;N=add();pre[0]=-1;last=ans=0;
while (n--)
{
scanf("%s",s);
for (int i=0; s[i]; i++) insert(s[i]-'0');
insert(10);
}
for (int i=0; i<=N; i++) cnt[step[i]]++;
for (int i=1; i<=N; i++) cnt[i]+=cnt[i-1];
for (int i=0; i<=N; i++) g[--cnt[step[i]]]=i;
t[0]=1; mark[0]=true;
for (int p=0; p<=N; p++)
{
int cur=g[p];
if (next[0][0]==cur && next[0][0]!=0) continue;
if (!mark[cur]) continue;
ans=(ans+f[cur])%2012;
for (int i=0; i<=9; i++)
{
if (next[cur][i]==0) continue;
f[next[cur][i]]=(f[next[cur][i]]+f[cur]*10+t[cur]*i)%2012;
t[next[cur][i]]=(t[next[cur][i]]+t[cur])%2012;
mark[next[cur][i]]=true;
}
}
printf("%d\n",ans);
}
return 0;
}
HDU4436_str2int的更多相关文章
随机推荐
- 【免费培训】腾讯WeTest&TesterHome WorkShop | 一起学压测
2019年,中国移动软件市场仍呈现快速增长趋势,移动新生态孕育而生.而移动软件质量问题越发受到用户的关注,成为用户体验的关键因素.目前移动软件测试人才稀缺,而性能测试作为一项高门槛.高技术的测试能力, ...
- excel 取前几位文字
1L.2L的分别用mid函数和left函数都没有问题. 问题是,如果用left函数,必须先确认,字符串中汉字必须排在左边第一个,接下来几个也必须是汉字:mid函数则是根据从左边第某个字符开始,一共取几 ...
- shentou mianshiti
给你一个网站你是如何来渗透测试的? 在获取书面授权的前提下.1)信息收集,1,获取域名的whois信息,获取注册者邮箱姓名电话等.2,查询服务器旁站以及子域名站点,因为主站一般比较难,所以先看看旁站有 ...
- 4. 为HelloWorld添加日志
回顾 通过上篇内容,我们已经使用flask编写了我们的第一个接口或者说是html页面.我们可以看到,使用flask来编写接口/页面是十分简单的.那么接下来,我们丰富一下上面的例子. 需求 现在的需求来 ...
- Python机器学习库SKLearn:数据集转换之管道和特征
转载自:https://blog.csdn.net/cheng9981/article/details/61918129 4.1 管道和特征:组合估计量 4.1.1 管道:链接估计 管道可以用于将多个 ...
- windows下在idea用maven导入spark2.3.1源码并编译并运行示例
一.前提 1.配置好maven:intellij idea maven配置及maven项目创建 2.下载好spark源码: 二.导入源码: 1.将下载的源码包spark-2.3.1.tgz解压(E:\ ...
- eos源码编译
编译源码 运行代码 在阿里云 纽约服务器上运行没有出现任何问题. 在其他电脑上出现很多问题. 搜集到的问题如下: 随着EOSIO软件越来越成熟,后来的开发者也越来越幸福.EOS相关源码的编译和运行变得 ...
- [机器学习]-K近邻-最简单的入门实战例子
本篇文章分为两个部分,前一部分主要简单介绍K近邻,后一部分是一个例子 第一部分--K近邻简介 从字面意思就可以容易看出,所谓的K近邻,就是找到某个样本距离(这里的距离可以是欧式距离,曼哈顿距离,切比雪 ...
- gzip命令详解
基础命令学习目录首页 好文链接:https://blog.csdn.net/m0_38132420/article/details/78577247 原文链接:http://www.cnblogs.c ...
- passwd命令详解
基础命令学习目录首页 passwd命令用于设置用户的认证信息,包括用户密码.密码过期时间等.系统管理者则能用它管理系统用户的密码.只有管理者可以指定用户名称,一般用户只能变更自己的密码. 语法 pas ...