Description

Input

Output

Sample Input

Sample Output

Solution

题意:给你两个串,分别从两个里面各选出一个子串拼到一起,问能构成多少个本质不同的字符串。

首先考虑一下,什么时候一个串会被重复计算。

例如假设串$abcad$,可以由$ab+cad$或$a+bcad$组成。

第一个串中可以用$ab$,也可以用$a$。$a$可以构成$abcad$,那么$ab$也能构成$abcad$。

也就是说,我们要在第一个串中找一个最靠右的,然后再到第二个串中找。

具体操作就是,在第一个串的$SAM$上$DFS$,如果字符$c$失配的话,就到第二个串的$SAM$上根的$c$儿子上继续去$DFS$。

这样就可以做到不重不漏了。再加一个记忆化就可以过了。还得开$unsigned~long~long$……

Code

 #include<iostream>
#include<cstring>
#include<cstdio>
#define N (220009)
#define LL unsigned long long
using namespace std; int T;
LL f1[N],f2[N];
char s[N],t[N]; struct SAM
{
int son[N][],fa[N],step[N];
int p,q,np,nq,last,cnt;
SAM(){last=cnt=;}
void clear()
{
last=cnt=;
memset(son,,sizeof(son));
memset(fa,,sizeof(fa));
memset(step,,sizeof(step));
}
void Insert(int x)
{
p=last; np=last=++cnt; step[np]=step[p]+;
while (p && !son[p][x]) son[p][x]=np,p=fa[p];
if (!p) fa[np]=;
else
{
q=son[p][x];
if (step[q]==step[p]+) fa[np]=q;
else
{
nq=++cnt; step[nq]=step[p]+;
memcpy(son[nq],son[q],sizeof(son[q]));
fa[nq]=fa[q]; fa[q]=fa[np]=nq;
while (son[p][x]==q) son[p][x]=nq,p=fa[p];
}
}
}
}SAM[]; LL DFS2(int x)
{
if (!x) return ;
if (f2[x]) return f2[x];
f2[x]=;
for (int i=; i<; ++i)
{
LL nxt=SAM[].son[x][i];
if (nxt) f2[x]+=DFS2(nxt);
}
return f2[x];
} LL DFS1(int x)
{
if (f1[x]) return f1[x];
f1[x]=;
for (int i=; i<; ++i)
{
LL nxt=SAM[].son[x][i];
if (nxt) f1[x]+=DFS1(nxt);
else f1[x]+=DFS2(SAM[].son[][i]);
}
return f1[x];
} int main()
{
scanf("%d",&T);
while (T--)
{
memset(f1,,sizeof(f1));
memset(f2,,sizeof(f2));
SAM[].clear(); SAM[].clear();
scanf("%s%s",s,t);
for (int i=,l=strlen(s); i<l; ++i)
SAM[].Insert(s[i]-'a');
for (int i=,l=strlen(t); i<l; ++i)
SAM[].Insert(t[i]-'a');
printf("%llu\n",DFS1());
}
}

HDU5343:MZL's Circle Zhou(SAM,记忆化搜索DP)的更多相关文章

  1. HDU5343 MZL's Circle Zhou(SAM+记忆化搜索)

    Problem Description MZL's Circle Zhou is good at solving some counting problems. One day, he comes u ...

  2. 记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence

    题目传送门 /* 记忆化搜索(DP+DFS):dp[i][j] 表示第i到第j个字符,最少要加多少个括号 dp[x][x] = 1 一定要加一个括号:dp[x][y] = 0, x > y; 当 ...

  3. hdu 5343 MZL's Circle Zhou SAM

    MZL's Circle Zhou 题意:给定两个长度不超过a,b(1 <= |a|,|b| <= 90000),x为a的连续子串,b为y的连续子串(x和y均可以是空串):问x+y形成的不 ...

  4. HNU OJ10086 挤挤更健康 记忆化搜索DP

    挤挤更健康 Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 339, A ...

  5. HDU 1078 FatMouse and Cheese 记忆化搜索DP

    直接爆搜肯定超时,除非你加了某种凡人不能想出来的剪枝...555 因为老鼠的路径上的点满足是递增的,所以满足一定的拓补关系,可以利用动态规划求解 但是复杂的拓补关系无法简单的用循环实现,所以直接采取记 ...

  6. 记忆化搜索 dp学习~2

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1331 Function Run Fun Time Limit: 2000/1000 MS (Java/ ...

  7. 【10.31校内测试】【组合数学】【记忆化搜索/DP】【多起点多终点二进制拆位Spfa】

    Solution 注意取模!!! Code #include<bits/stdc++.h> #define mod 1000000007 #define LL long long usin ...

  8. hdu1331&&hdu1579记忆化搜索(DP+DFS)

    这两题是一模一样的``` 题意:给了一系列递推关系,但是由于这些递推很复杂,所以递推起来要花费很长的时间,所以我要编程序在有限的时间内输出答案. w(a, b, c): 如果a,b,c中有一个值小于等 ...

  9. BZOJ1048:[HAOI2007]分割矩阵(记忆化搜索DP)

    Description 将一个a*b的数字矩阵进行如下分割:将原矩阵沿某一条直线分割成两个矩阵,再将生成的两个矩阵继续如此分割(当然也可以只分割其中的一个), 这样分割了(n-1)次后,原矩阵被分割成 ...

随机推荐

  1. 从Object对象中读取属性的值

    C#是强类型语言,强到多变态?一个对象没有定义某个属性,你想点出来,IDE直接给你报语法错误.远不如js那么自由,想怎么点怎么点. 如果你从别人接口中拿到的就是Object类型,你想获取某个属性的值怎 ...

  2. Media change: please insert the disc labeled

    问题描述和重现步骤: 今天安装完Ubuntu后准备安装openssh-server apt-get install openssh-server 结果发现下面的错误. Media change: pl ...

  3. Hive 基础你需要掌握这些

    HDFS 中一个简单的 Join查询,是否需要撸一大串代码?我只会SQL语句 能不能入坑大数据?这里我们就来聊一聊 Hive. Hive 是什么? Hive 是一种数据仓库工具,不提供数据存储(数据还 ...

  4. fzu 2139 久违的月赛之二

    Problem 2139 久违的月赛之二 Accept: 42    Submit: 106Time Limit: 1000 mSec    Memory Limit : 32768 KB Probl ...

  5. CSS3入门学习之属性大全手册

    CSS Level 2 经历了 9 年的时间(从 2002 年 8 月到 2011 年 6 月)才达到 Recommendation(推荐) 状态.主要的原因是被一些 secondary featur ...

  6. linux 链接命令

    ln link /bin/ln -s 创建软链接ln -s [原文件] [链接文件] 软链接 ln -s /etc/issue /tmp/issue.soft硬链接ln /etc/issue /tmp ...

  7. LOCAL_LISTENER 引起的错误

    1. 如果你的LOCAL_LISTENER 指定的是一个别名 比如L2 *.local_listener='L2' 启动实例的时候 会先到 tnsnames.ora 文件里取查找定义名为L2的TNS服 ...

  8. EF增删查改基类

    /// <summary> /// EF DAL CURD基类 /// </summary> /// <typeparam name="T">& ...

  9. 团队项目——软件需求分析(NABCD)

    一.团队项目简介 团队名称:SmartCoder 项目名称:<一起> 二.针对 " 地图可视化查看发布的内容 " 这一特点进行 NABCD 分析 N(Need需求) 往 ...

  10. ShowDoc

    ShowDoc 摘自ShowDoc 每当接手一个他人开发好的模块或者项目,看着那些没有写注释的代码,我们都无比抓狂.文档呢?!文档呢?!Show me the doc !! 程序员都很希望别人能写技术 ...