【HDU 4436】 str2int (广义SAM)
str2int
Problem DescriptionIn this problem, you are given several strings that contain only digits from '0' to '9', inclusive.
An example is shown below.
101
123
The set S of strings is consists of the N strings given in the input file, and all the possible substrings of each one of them.
It's boring to manipulate strings, so you decide to convert strings in S into integers.
You can convert a string that contains only digits into a decimal integer, for example, you can convert "101" into 101, "01" into 1, et al.
If an integer occurs multiple times, you only keep one of them.
For example, in the example shown above, all the integers are 1, 10, 101, 2, 3, 12, 23, 123.
Your task is to calculate the remainder of the sum of all the integers you get divided by 2012.InputThere are no more than 20 test cases.
The test case starts by a line contains an positive integer N.
Next N lines each contains a string consists of one or more digits.
It's guaranteed that 1≤N≤10000 and the sum of the length of all the strings ≤100000.
The input is terminated by EOF.OutputAn integer between 0 and 2011, inclusive, for each test case.Sample Input5101123090001234567890Sample Output202Source
广义SAM,每个点记录一个ans,表示它代表的串的值的和。如果有前缀0,记得不能加进去,每个点标记一下它表示的串又做少个是有前缀0的,记为zr,用父亲的ans和zr更新儿子。
if(now==1&&k==0) t[np].zr=1;
else t[np].zr+=t[now].zr;
t[np].ans=(t[np].ans+t[now].ans*10+(t[now].step-t[t[now].pre].step-t[now].zr)*k);
SAM上有一步是新加一个点,继承某一个点的信息,记得这里要搞一下,把旧点信息减新点信息。
建完机就可以直接统计答案了哈哈哈!!!
具体看代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<set>
using namespace std;
#define Mod 2012
#define Maxn 1000010 int n;
struct node
{
int pre,step,son[];
int ans,zr;
}t[*Maxn];int tot;
int last; char s[Maxn]; void upd(int x)
{
memset(t[x].son,,sizeof(t[x].son));
t[x].pre=;
t[x].ans=;t[x].zr=;
} void add(int now,int k,int np)
{
// if(now==1&&k==0) return;
if(now==&&k==) t[np].zr=;
else /*if(k==0)*/ t[np].zr+=t[now].zr;
t[now].son[k]=np;
t[np].ans=(t[np].ans+t[now].ans*+(t[now].step-t[t[now].pre].step-t[now].zr)*k)%Mod;
} void extend(int k)
{
int np=++tot;upd(tot);
t[np].step=t[last].step+;
int now=last;
while(now&&!t[now].son[k])
{
add(now,k,np);// t[now].son[k]=np;
now=t[now].pre;
}
if(!now) t[np].pre=;
else
{
int p=now,q=t[now].son[k];
if(t[p].step+==t[q].step) t[np].pre=q;
else
{
int nq=++tot;upd(tot);
memcpy(t[nq].son,t[q].son,sizeof(t[nq].son));
t[nq].pre=t[q].pre;
t[q].pre=t[np].pre=nq;
t[nq].step=t[p].step+;
while(now&&t[now].son[k]==q)
{
// t[now].son[k]=nq;
add(now,k,nq);
now=t[now].pre;
}
t[q].ans=(t[q].ans+Mod-t[nq].ans)%Mod;
t[q].zr-=t[nq].zr;
}
}
last=np;
} int main()
{
while(scanf("%d",&n)!=EOF)
{
tot=;
t[++tot].step=;upd(tot);
for(int i=;i<=n;i++)
{
scanf("%s",s+);
int l=strlen(s+);
last=;
for(int j=;j<=l;j++)
{
int k=s[j]-'';
extend(k);
}
}
int ans=;
for(int i=;i<=tot;i++) ans=(ans+t[i].ans)%Mod;
printf("%d\n",ans);
}
return ;
}
[HDU 4436]
2016-09-21 20:51:06
【HDU 4436】 str2int (广义SAM)的更多相关文章
- HDU 4436 str2int (后缀自动机SAM,多串建立)
str2int Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total S ...
- HDU 4436 str2int
str2int Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on HDU. Original ID: 4 ...
- HDU 4436 str2int(后缀自动机)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4436 [题目大意] 给出一些字符串,由0~9组成,求出所有不同子串的和. [题解] 将所有字符串添 ...
- 字符串(多串后缀自动机):HDU 4436 str2int
str2int Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total S ...
- HDU 4436 str2int (后缀自动机)
把所有的字符串连接起来,中间用一个未出现的字符分隔开,题意是求这个串的所有子串(中间不含分隔符)形成的数之和. 把这个串加入SAM,对所有子串进行拓扑排序,从前往后统计. 记录到达这个节点的路径个数c ...
- HDU 4436 str2int(后缀自动机)(2012 Asia Tianjin Regional Contest)
Problem Description In this problem, you are given several strings that contain only digits from '0' ...
- HDU 4436 (后缀自动机)
HDU 4436 str2int Problem : 给若干个数字串,询问这些串的所有本质不同的子串转换成数字之后的和. Solution : 首先将所有串丢进一个后缀自动机.由于这道题询问的是不同的 ...
- HDU 6405 Make ZYB Happy(广义SAM)
It's known to all that ZYB is godlike, so obviously he has a large number of titles, such as jskingj ...
- 【BZOJ 3926】 [Zjoi2015]诸神眷顾的幻想乡 (广义SAM)
3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 974 Solved: 573 Descriptio ...
随机推荐
- 几个MVC属性
1 用于显示提示字符串 [Required(ErrorMessage="请输入类型名称")] public string ArticleTypeName { get; set; ...
- FOR XML PATH 转换问题
以下我带大家了解关于 FOR XML PATH 首先我们看下所熟悉的表数据 之后转换 <骨牌编号>1</骨牌编号> <骨牌颜色>橙</骨牌颜色> < ...
- linux/windows系统oracle数据库简单冷备同步
linux/windows系统oracle数据库简单冷备同步 我们有一个财务系统比较看重财务数据的安全性,同时我们拥有两套系统,一个生产环境(linux),一个应急备份环境(windows).备份环境 ...
- 关于arcgis 9.3破解问题详解
对于初学GIS的同学,安装软件可能会遇到各种各样的问题,对于photoshop,autocad,sketchup,3dmax等软件我们的我们无非是输入特定序列号或者用工具随机生成特定序列号就可以破解, ...
- Dynamic Programming: From novice to advanced
作者:Dumitru 出处:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=dynProg An impo ...
- 处理safari缓存的办法
window.onpageshow = function(event) { if (event.persisted) { alert("From bac ...
- ubuntu基本操作(2)
查看当前使用那种 shell echo $SHELL 更换 shell 类型:首先检查是否安装了相应的类型 shell开启终端,直接输入相应的 shell 名称如果没有安装,则先安装,否则直接启动此时 ...
- 转: Android异步加载图像小结
转:http://blog.csdn.net/sgl870927/article/details/6285535 研究了android从网络上异步加载图像,现总结如下: (1)由于android UI ...
- linux下安装phpredis
一.redis安装 1. yum install redis (不行的先执行:yum install epel-release,再yum install redis) 2.启动服务 redis-ser ...
- js实现幻灯片播放图片示例代码
幻灯片播放图片的效果想必大家都有见到过吧,下面有个不错的示例,感兴趣的朋友可以参考下 复制代码代码如下: <select id="img_date" style=" ...