【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 ...
随机推荐
- openwrt chinadns
opkg update opkg install ip ipset resolveip iptables-mod-tproxy resolveip libopenssl luci-i18n-base- ...
- C#三元运算符
?:表达式1?表达式2:表达式3如果1为真则执行2,为假执行3
- YII设置用户访问过滤
设置用户访问过滤 1.哪个控制器设置访问过滤,就在哪个控制器中添加如下代码 class XxxController extends Controller { //当前控制器是否使用过滤功能 publi ...
- Oracle初始化
/*第1步:创建临时表空间 */ create temporary tablespace mdb_temp tempfile 'G:\data\oracle\mdb_temp.ora' size 10 ...
- ios UIWebView截获html并修改便签内容
需求:混合应用UIWebView打开html后,UIWebView有左右滚动条,要去掉左右滚动效果: 方法:通过js截获UIWebView中的html,然后修改html标签内容: 实例代码: 服务器端 ...
- iOS开发中常用的分类方法---UIImage+Category
在开发中使用分类对原有的系统类进行方法扩展,是增强系统原有类功能的常见做法. /** * 自由拉伸一张图片 * * @param name 图片名字 * @param left 左边开始位置比例 值范 ...
- JS 浮点型数字运算(转)
示例: var num1=3.3; var num2=7.17; var ret=parseFloat(num1)+parseFloat(num2); //ret的值为:10.469999999999 ...
- java_UML:继承/泛化、实现、依赖、关联、聚合、组合的联系与区别 (2016-07-12)
分别介绍这几种关系: UML关系:继承(泛化).实现.依赖.关联.聚合.组合的联系与区别 一.表示符号上的区别 二.具体区别与联系 1. 继承/泛化(Generalization) [泛化关系]:是一 ...
- 10.26_地图应用, OSC_doc文档集合,node-webkit
(1)地图:关于电子地图的加载.展示方式,知乎上有篇文章写的很好:http://www.zhihu.com/question/21530085对于地图的导航距离计算呢?原理是什么? (2)node-w ...
- clr介绍
CLR(公用语言运行时)和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系统之间必要的分离..NET提供了一个运行时环境,叫做公用语言运行时(Comm ...