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的更多相关文章
随机推荐
- python的super函数学习
一.为什么要用super? 在Python 2.2以前,通常的做法: class A: def __init__(self): print "enter A" print &quo ...
- TensorFlow Python2.7环境下的源码编译(一)环境准备
参考: https://blog.csdn.net/yhily2008/article/details/79967118 https://tensorflow.google.cn/install/in ...
- ThinkPHP学习笔记(一)----初识ThinkPHP
在做微信开发的时候原本使用来yii框架,后续觉得yii虽然功能强大使用方便,但是整个框架太大了,不适合一些轻量级的开发:这个时候发现thinkphp这个框架,框架本身很小,只有几M,但麻雀虽小,但五脏 ...
- 【SIKIA计划】_05_Unity5.3开发2D游戏笔记
一.界面基本操作 01.Project基本分类[Audios]音效[Material]材质[Prefabs]预制[Scenes]场景[Scripts]脚本[Sprites]精灵 02.Project丶 ...
- jQuery的$ .ajax防止重复提交的方法
没啥说的直接贴代码,很简单: 第一种方式:的onclick点击事件类型 <SCRIPT> function member_del(obj,id){ var lock = false; // ...
- 【LeetCode算法题库】Day5:Roman to Integer & Longest Common Prefix & 3Sum
[Q13] Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Valu ...
- Netty源码分析第4章(pipeline)---->第4节: 传播inbound事件
Netty源码分析第四章: pipeline 第四节: 传播inbound事件 有关于inbound事件, 在概述中做过简单的介绍, 就是以自己为基准, 流向自己的事件, 比如最常见的channelR ...
- 高可用OpenStack(Queen版)集群-13.分布式存储Ceph
参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...
- 小球下落(Dropping Balls, Uva 679)
题目描述 有一棵二叉树,最大深度为D,且所有的叶子深度都相同.所有结点从上到下从左到右编号为1,2,3,-,2eD-1.在结点1处放一个小球,它会往下落.每个结点上都有一个开关,初始全部关闭,当每次有 ...
- TensorFlow --- 01初识
由于博客园对Markdown支持不够友好,阅读此文请前往云栖社区:TensorFlow --- 01初识