HDOJ 4416 Good Article Good sentence
题解转自:http://blog.csdn.net/dyx404514/article/details/8807440
2012杭州网络赛的一道题,后缀数组后缀自己主动机都行吧。
题目大意:给一个字符串S和一系列字符串T1~Tn,问在S中有多少个不同子串满足它不是T1~Tn中随意一个字符串的子串。
思路:我们先构造S的后缀自己主动机,然后将每个Ti在S的SAM上做匹配,类似于LCS,在S中的每个状态记录一个变量deep,表示T1~Tn,在该状态能匹配的最大长度是多少,将每个Ti匹配完之后,我们将S的SAM做拓扑排序,自底向上更新每个状态的deep,同一时候计算在该状态上有多少个子串满足题目要求。详细过程例如以下:
1:对于当前状态,设为p,设p的par为q,则更新q->deep为q->deep和p->deep中的较大值。
2:若p->deep<p->val,则表示在状态p中,长度为p->deep+1~p->val的子串不是T1~Tn中随意字符串的子串,所以答案加上p->val-p->deep。否则表示状态p中全部字串均不满足要求,跳过就可以。
(注意若p->deep==0,表示状态p中全部的子串均满足题目要求,可是答案不是加上p->val-0,而是加上 p->val-p->par->val,这表示状态p中的字符串个数,所以对于p->deep==0要特殊处理)
最后输出答案就可以。
Good Article Good sentence
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2112 Accepted Submission(s): 587
distinct pretty sentences might benefit him a lot to get a high score in his article.
Assume that all of the sentences came from some articles. ZengXiao Xian intended to pick from Article A. The number of his classmates is n. The i-th classmate picked from Article Bi. Now ZengXiao Xian wants to know how many different sentences she could pick
from Article A which don't belong to either of her classmates?Article. To simplify the problem, ZengXiao Xian wants to know how many different strings, which is the substring of string A, but is not substring of either of string Bi. Of course, you will help
him, won't you?
For each test data
The first line contains an integer meaning the number of classmates.
The second line is the string A;The next n lines,the ith line input string Bi.
The length of the string A does not exceed 100,000 characters , The sum of total length of all strings Bi does not exceed 100,000, and assume all string consist only lowercase characters 'a' to 'z'.
3
2
abab
ab
ba
1
aaa
bbb
2
aaaa
aa
aaa
Case 1: 3
Case 2: 3
Case 3: 1
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; const int maxn=110000; struct SAM_Node
{
SAM_Node *fa,*next[26];
int len,id,pos;
SAM_Node(){}
SAM_Node(int _len)
{
len=_len;
fa=0; memset(next,0,sizeof(next));
}
}; SAM_Node SAM_node[maxn*2],*SAM_root,*SAM_last;
int SAM_size; SAM_Node *newSAM_Node(int len)
{
SAM_node[SAM_size]=SAM_Node(len);
SAM_node[SAM_size].id=SAM_size;
return &SAM_node[SAM_size++];
} SAM_Node *newSAM_Node(SAM_Node *p)
{
SAM_node[SAM_size]=*p;
SAM_node[SAM_size].id=SAM_size;
return &SAM_node[SAM_size++];
} void SAM_init()
{
SAM_size=0;
SAM_root=SAM_last=newSAM_Node(0);
SAM_node[0].pos=0;
} void SAM_add(int x,int len)
{
SAM_Node *p=SAM_last,*np=newSAM_Node(p->len+1);
np->pos=len; SAM_last=np;
for(;p&&!p->next[x];p=p->fa)
p->next[x]=np;
if(!p)
{
np->fa=SAM_root;
return ;
}
SAM_Node *q=p->next[x];
if(q->len==p->len+1)
{
np->fa=q;
return ;
}
SAM_Node *nq=newSAM_Node(q);
nq->len=p->len+1;
q->fa=nq; np->fa=nq;
for(;p&&p->next[x]==q;p=p->fa)
p->next[x]=nq;
} char A[maxn],B[maxn];
int c[maxn*2],LCS[maxn*2];
SAM_Node *top[maxn*2]; int main()
{
int T_T,T,cas=1;
scanf("%d",&T_T);
while(T_T--)
{
scanf("%d",&T);
scanf("%s",A);
int len=strlen(A);
SAM_init();
for(int i=0;i<len;i++)
SAM_add(A[i]-'a',i+1); memset(c,0,sizeof(c));
memset(LCS,0,sizeof(LCS));
memset(top,0,sizeof(top)); for(int i=0;i<SAM_size;i++)
c[SAM_node[i].len]++;
for(int i=1;i<=len;i++)
c[i]+=c[i-1];
for(int i=0;i<SAM_size;i++)
top[--c[SAM_node[i].len]]=&SAM_node[i];
while(T--)
{
scanf("%s",B);
int len2=strlen(B);
int temp=0; SAM_Node *now=SAM_root; for(int i=0;i<len2;i++)
{
int x=B[i]-'a';
if(now->next[x])
{
temp++;
now=now->next[x];
LCS[now->id]=max(LCS[now->id],temp);
}
else
{
while(now&&!now->next[x])
now=now->fa;
if(now)
{
temp=now->len+1;
now=now->next[x];
LCS[now->id]=max(LCS[now->id],temp);
}
else
{
temp=0; now=SAM_root;
}
}
}
}
long long int ans=0;
for(int i=SAM_size-1;i>=1;i--)
{
SAM_Node *p=top[i];
if(LCS[p->id])
{
if(p->fa)
LCS[p->fa->id]=max(LCS[p->fa->id],LCS[p->id]);
if(LCS[p->id]<p->len)
{
ans+=p->len-LCS[p->id];
}
}
else
{
ans+=p->len-p->fa->len;
}
}
printf("Case %d: %I64d\n",cas++,ans);
}
return 0;
}
HDOJ 4416 Good Article Good sentence的更多相关文章
- HDU 4416 Good Article Good sentence(后缀自动机)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4416 [题目大意] 给出一个字符串,然后,给出一个字符串集合,问在该字符串中出现,且不在字符串集合 ...
- [hdu 4416]Good Article Good sentence
最近几天一直在做有关后缀自动机的题目 感觉似乎对后缀自动机越来越了解了呢!喵~ 这题还是让我受益颇多的,首先搞一个后缀自动机是妥妥的了 可是搞完之后呢? 我们来观察 step 这个变量,每个节点的 s ...
- Good Article Good sentence HDU - 4416 (后缀数组)
Good Article Good sentence \[ Time Limit: 3000 ms\quad Memory Limit: 32768 kB \] 题意 给出一个 \(S\) 串,在给出 ...
- Good Article Good sentence HDU - 4416 (后缀自动机)
Good Article Good sentence \[ Time Limit: 3000 ms\quad Memory Limit: 32768 kB \] 题意 给出一个 \(S\) 串,在给出 ...
- HDOJ 3507 Print Article
Print Article Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)To ...
- HDU4416Good Article Good sentence(后缀自动机)
Problem Description In middle school, teachers used to encourage us to pick up pretty sentences so t ...
- hdu4416 Good Article Good sentence (后缀数组)
题意:问a串中有多少种字符串集合B中没有的连续子串. a的长度10^5,B中的总长度为不超过10^5. 解法:后缀数组题目:后缀数组能够非常easy算出来一个串中有多少种子串. 把a和B集合连起来.求 ...
- [hdu4416 Good Article Good sentence]后缀自动机SAM
题意:给出串A和串集合B={B1,B2,...,Bn},求串A的所有不同子串中不是B中任一串的子串的数目. 思路:把A和B中所有字符串依次拼接在一起,然后构造后缀自动机,计算每个状态的R集合元素的最大 ...
- HDU 4416 (后缀自动机)
HDU 4416 Good Article Good sentence Problem : 给一个串S,和一些串T,询问S中有多少个子串没有在T中出现. Solution :首先对所有的T串建立后缀自 ...
随机推荐
- RH253读书笔记(8)-Lab 8 Securing Data
Lab 8 Securing Data Goal: Gain familiarity with encryption utilities Sequence 1: Using SSH keys with ...
- HDU ACM 1068 最大独立集
意甲冠军:n同学.有些学生将有宿命的男性和女性成为恋人.收集注定要成为爱好者求学生的最大数目不存在. 分析:独立设置,顶点设定图的一个子集,在休闲2不连续: 二分图:最大独立集 = 顶点 - 匹配的最 ...
- 3D数学学习笔记——笛卡尔坐标系
本系列文章由birdlove1987编写.转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/24601215 1.3D数学 ...
- 开源 自由 java CMS - FreeCMS2.0 签字
项目地址:http://www.freeteam.cn/ 会员注冊 打开浏览器,输入http://localhost:8080/register.jsp. 输入注冊信息后点击"注冊" ...
- C# Windows Schedule task此次收购task下一步执行时间
最近进行了一次需求和Windows Schedule task相关职能,通过schedule,计算下一次运行task时间. 它用于由第三方DLL实现,以下网站,以下载来自: http://tasksc ...
- uva 1500 - Alice and Bob(论证)
option=com_onlinejudge&Itemid=8&page=show_problem&problem=4246" target="_blank ...
- BIEE在creating domain步骤停止的解决的方法
1.错误现象: biee11g creating domain csf entries will not be parsed since the adminserver is unreachable ...
- 【百度地图API】如何利用地图API制作汽车沿道路行驶的动画?——如何获得道路层数据
原文:[百度地图API]如何利用地图API制作汽车沿道路行驶的动画?--如何获得道路层数据 有几个做汽车导航的朋友问我说,他们想在地图上制作一辆车沿着道路行驶的动画.可是,百度地图的道路数据并没有公开 ...
- Java数据结构与算法(1) - ch02有序表(OrderedArray)
有序表需要掌握的插入方法,删除方法和二分法查找方法. 插入方法: 从前往后找到比要插入的值大的数组项,将该数组项及之后的项均后移一位(从最后一项起依次后移),最后将要插入的值插入当前数组项. 删除方法 ...
- SQL2005性能分析一些细节功能你是否有用到?(二)
原文:SQL2005性能分析一些细节功能你是否有用到?(二) 上一篇:SQL2005性能分析一些细节功能你是否有用到? 我简单的提到了些关于SQL性能分析最基本的一些方法,下面的文章我会陆续补充.前面 ...