【Vijos1382】【BZOJ1398】寻找主人 Necklace

原创 2015年11月19日 19:45:37

Description
这里写图片描述
给定两个项链的表示,判断他们是否可能是一条项链。
Input

输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的)。
Output

如果两条项链不可能同构,那么输出’No’,否则的话,第一行输出一个’Yes’,第二行输出该项链的字典序最小的表示。 设L = 项链长度, 对于50%的数据L <= 100000; 对于100%的数据L <= 1000000。
Sample Input

Sample Output

HINT

Source

yts大爷骗我QAQ跟我说用SAM做
然而您的AC代码只有3MB内存是什么意思…
然后我就做了然后就被卡内存了
BZOJ卡内存丧心病狂啊!!!Vijos不卡内存A了…

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 2000010
using namespace std;
char ch1[MAXN>>2],ch2[MAXN>2],s1[MAXN>>2],s2[MAXN>>2];
struct sam
{
    int last,cnt,p,np,q,nq;
    int len[MAXN],a[MAXN][10],fa[MAXN];
    sam()
    {
        last=++cnt;
    }
    void insert(int c)
    {
        p=last;last=np=++cnt;len[np]=len[p]+1;
        while (!a[p][c]&&p) a[p][c]=np,p=fa[p];
        if (!p) fa[np]=1;
        else
        {
            q=a[p][c];
            if (len[q]==len[p]+1)   fa[np]=q;
            else
            {
                nq=++cnt;len[nq]=len[p]+1;
                memcpy(a[nq],a[q],sizeof(a[q]));
                fa[nq]=fa[q];fa[q]=fa[np]=nq;
                while (a[p][c]==q)  a[p][c]=nq,p=fa[p];
            }
        }
    }
}sam;
int main()
{
    scanf("%s",ch1+1);int n=strlen(ch1+1);
    for (int T=1;T<=2;T++)
        for (int i=1;i<=n;i++)  sam.insert(ch1[i]-'0');
    int st=1;
    for (int i=1;i<=n;i++)
        for (int j=0;j<=9;j++)
            if (sam.a[st][j])   {st=sam.a[st][j];s1[i]=j+'0';break;}
    st=1;sam.last=sam.cnt=1;scanf("%s",ch1+1);
    memset(sam.a,0,sizeof(sam.a));memset(sam.fa,0,sizeof(sam.fa));memset(sam.len,0,sizeof(sam.len));
    for (int T=1;T<=2;T++)
        for (int i=1;i<=n;i++)  sam.insert(ch1[i]-'0');
    for (int i=1;i<=n;i++)
        for (int j=0;j<=9;j++)
            if (sam.a[st][j])   {st=sam.a[st][j];s2[i]=j+'0';break;}
    for (int i=1;i<=n;i++)
        if (s1[i]!=s2[i])   {puts("No");return 0;}
    puts("Yes");
    for (int i=1;i<=n;i++)  putchar(s1[i]);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

【bzoj1398】Vijos1382寻找主人 Necklace 最小表示法

这道题只需要把原串复制一遍,然后拿另一个串去匹配就可以了。 但是作死学了下最小表示法。 http://wenku.baidu.com/link?url=disErIxplfqlFvdZy2Zy3q7F...
  • u012288458
  • u012288458
  • 2016年01月03日 20:26
  • 300

bzoj1398 寻找主人

Description  给定两个项链的表示,判断他们是否可能是一条项链。 Input 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的)。 ...
  • lzr010506
  • lzr010506
  • 2016年02月14日 09:19
  • 240

Vijos1382 寻找主人

new blog! 标签:最小表示法 题目 题目传送门 背景 有一天,袁☆同学绵了一条价值连城宝石项链,但是,一个严重的问题是,他竟然忘记了项链的主人是谁!在得知此事后,很多人向☆同学发来了...
  • qwerty1125
  • qwerty1125
  • 2018年01月15日 18:19
  • 19

bzoj 1398: Vijos1382寻找主人 Necklace (后缀自动机)

题目描述传送门题目大意:判断两个串是否同构,并超出与其同构的最小表示。题解这道题貌似是最小表示法的裸题,但是我们并不会最小表示法,所以就用后缀自动机来做了,但是这道题的内存按理来说是不能写后缀自动机的...
  • clover_hxy
  • clover_hxy
  • 2017年04月05日 08:08
  • 177

bzoj 1398 项链 【最小表示法】

盗CA爷的题,学习了最小表示法,最后发现CA爷不是写的这个算法。 但不管了。 最小表示法大致是维护两个指针ij且i!=j 把它们向后扫,直到st[i+k]!=st[j+k] 然后将st较大的那个指...
  • heheda_is_an_OIer
  • heheda_is_an_OIer
  • 2015年11月20日 23:10
  • 631

【SDOI2009】【BZOJ1227】虔诚的墓主人

Description小W 是一片新造公墓的管理人。公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地。当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找...
  • CreationAugust
  • CreationAugust
  • 2016年02月20日 17:11
  • 577

女神进化论寺主人:如何用设计思维,从 0 做到 300 万粉丝?

本文整理自知群App (和资深设计师、产品、运营一起学习、共同成长)线下访谈节目「马力全开」: 2017 年 12 月 20 日,「马力全开」知乎 Live 栏目邀请寺主人讲述自己创业做自媒体『女...
  • bKMk01MZ3w
  • bKMk01MZ3w
  • 2017年12月13日 20:38
  • 97

hdu 1969 Pie(贪心+二分查找)(简单)

题意: 生日家里来了F个朋友,他家里有好N个Pie,主人希望把Pie分出F+1份(自己也要一个),要求体积相同,所有的Pie不需要都分完,问你每个人最大能分到多大体积的Pie。 思路: 贪心+...
  • kaisa158
  • kaisa158
  • 2015年07月16日 14:55
  • 647

HDU6030-Happy Necklace-找规律+矩阵快速幂

//传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6030 #include #include #include #include #includ...
  • survivorone
  • survivorone
  • 2017年05月07日 22:38
  • 537

山东省第一届ACM省赛 C SDUT 2153 Clockwise(dp+计算几何)

Clockwise Time Limit: 1000ms | Memory limit: 65536K 有疑问?点这里^ 题目描述Saya have a long neck...
  • Code_KK
  • Code_KK
  • 2016年04月12日 11:46
  • 396
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Vijos1382】【BZOJ1398】寻找主人 Necklace
举报原因:
原因补充:

(最多只允许输入30个字)