0111:Mushroom写情书

总时间限制: 
10000ms

内存限制: 
256000kB
描述

有一天,Mushroom准备向他的GF表白,为了增加表白成功率,Mushroom写了封情书寄给他的GF(记为S1),而他的GF也回寄了一封(记为S2)。现在,Mushroom想知道,这两封信的最长公共子串是多少。

输入
两行仅包含小写字母的字符串(S1,S2)。
输出
当不存在公共字符串时,输出一行0,。否则先输出一行表示最长公共子串,再输出最长公共子串的长度,如果有多个解满足,输出首先在S2中出现的(详见样例)
样例输入
abcdef
defabc
样例输出
def
3 // abc和def都在S1和S2中出现过,由于def在S2中先出现,所以输出def
提示
对于30%的数据,1<=|S2|<=|S2|<=100
对于60%的数据,1<=|S2|<=|S2|<=1000
对于100%的数据,1<=|S2|<=|S2|<=250000
来源
mushroom
在做這道題之前還重來沒有編過雙hash,這次算是找了一下感覺,反正自己覺得雙hash非常容易些錯,所以以後要多加小心。
考場上我用的後綴數組,由於題目中要求優先在s2中出現,所以後綴數組顯得非常麻煩。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<string>
#include<queue>
#include<stack>
using namespace std;
#ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif
#define MAXN 251000
#define MAXM 251000
#define MAXE MAXN
#define VAL1 100007
#define VAL2 1000007
#define PROB "letter"
typedef long long qword;
const qword mod=;
const qword _a=;
qword hs1[MAXN],hs2[MAXN];
qword pow_mod(qword a,int x)
{
qword ret=;
while (x)
{
if (x&)ret=ret*a%mod;
a=a*a%mod;
x>>=;
}
return ret;
} inline qword hash1(int x,int y)
{
return ((hs1[y]-hs1[x-]*pow_mod(_a,y-x+))%mod+mod)%mod;
}
inline qword hash2(int x,int y)
{
return ((hs2[y]-hs2[x-]*pow_mod(_a,y-x+))%mod+mod)%mod;
} /*
struct aaa
{
short s[MAXN];
char ss[MAXN];
int v[MAXN];
void Init(char *_ss)
{
strcpy(ss,_ss);
n=strlen(ss);
m=n;
int i;
for (i=0;i<n;i++)
{
s[i]=ss[i]-'a'+2;
}
v[0]=1;
for (i=1;i<n;i++)
{
v[i]=(v[i-1]*_a+s[i])%mod;
}
}
};*/
struct Edge
{
int pos;
Edge *next;
}E[MAXE],*V1[VAL1],*V2[VAL2];
int tope=-;
void addedge(Edge **V,int x,int y)
{
E[++tope].pos=y;
E[tope].next=V[x];
V[x]=&E[tope];
}
bool cross(Edge *ne1,Edge *ne2)
{
Edge *ne3,*ne4;
for (ne3=ne1;ne3;ne3=ne3->next)
{
for (ne4=ne2;ne4;ne4=ne4->next)
{
if (ne3->pos==ne4->pos)return true;
}
}
return false;
}
char str[][MAXN];
int main()
{
freopen(PROB".in","r",stdin);
freopen(PROB".out","w",stdout);
//freopen(PROB".out","w",stdout);
int i,j,k;
int x,y,z;
scanf("%s\n%s",str[]+,str[]+);
int n=strlen(str[]+),m=strlen(str[]+);
int l=,r=min(n,m)+;
int mid;
hs1[]=hs2[]=;
for (i=;i<=n;i++)
hs1[i]=((qword)hs1[i-]*_a%mod+str[][i]-'a'+)%mod;
for (i=;i<=m;i++)
hs2[i]=((qword)hs2[i-]*_a%mod+str[][i]-'a'+)%mod;
//cout<<hash1(1,2)<<endl;;
bool flag;
int ansp;
while (l+<r)
{
memset(V1,,sizeof(V1));
memset(V2,,sizeof(V2));
flag=false;
mid=(l+r)>>;
tope=-;
// mid=8;
for (i=;i+mid-<=n;i++)
{
y=i+mid-;
x=i;
z=hash1(x,y);
addedge(V1,z%VAL1,x);
addedge(V2,z%VAL2,x);
// cout<<z<<endl;
}
for (i=;i+mid-<=m;i++)
{
y=i+mid-;
x=i;
z=hash2(x,y);
if (V1[z%VAL1] && V2[z%VAL2] && cross(V1[z%VAL1],V2[z%VAL2]))
{
flag=true;
ansp=i;
break;
}
// cout<<"#"<<z<<endl;
}
if (flag)
l=mid;
else
r=mid;
}
str[][l+ansp]=;
printf("%s\n%d\n",str[]+ansp,l);
return ;
}

Contest 20140914 Mushroom写情书 字符串雙hash 後綴數組的更多相关文章

  1. 【BZOJ3796】Mushroom追妹纸 二分+hash

    [BZOJ3796]Mushroom追妹纸 Description Mushroom最近看上了一个漂亮妹纸.他选择一种非常经典的手段来表达自己的心意——写情书.考虑到自己的表达能力,Mushroom决 ...

  2. redis 2 字符串 和 hash

    string是最简单的类型,一个key对应一个value,string类型是二进制安全的.redis的string可以包含任何数据,比如JPG图片或者序列化的对象 操作    set    设置key ...

  3. 写出将字符串中的数字转换为整型的方法,如:“as31d2v”->312,并写出相应的单元测试,正则去掉非数值、小数点及正负号外的字符串

    写出将字符串中的数字转换为整型的方法,如:"as31d2v"->312,并写出相应的单元测试,输入超过int范围时提示不合法输入. public struct Convert ...

  4. 【转载】一步一步写算法(之hash表)

    转载自:http://blog.csdn.net/feixiaoxing/article/details/6885657 [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaox ...

  5. 一步一步写算法(之hash表)

    [ 声明:版权全部,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] hash表,有时候也被称为散列表.个人觉得,hash表是介于链表和二叉树之间的一种中间结构.链 ...

  6. mycat1.6.5分片(字符串拆分hash)

    https://blog.csdn.net/webnum/article/details/78313525   分片规则:字符串拆分hash 一.conf/schema.xml文件   <?xm ...

  7. 用Python分析下王小波与李银河写情书最爱用哪些词

    作家王小波其实也是我国最早期的程序员,突发奇想,王小波写情书最喜欢用哪些词呢?用Python词云分析下! 直接上代码吧,有注释很好理解.输出的图片设置的比较大,所以运行的比较慢,可以适当把图片尺寸改小 ...

  8. js字符串轉數組,數組轉字符串

    字符串轉數組:split(',') 數組轉字符串:join(‘,’) https://www.cnblogs.com/woodk/p/5714329.html

  9. 学习hash_map从而了解如何写stl里面的hash函数和equal或者compare函数

    ---恢复内容开始--- 看到同事用unordered_map了所以找个帖子学习学习 http://blog.sina.com.cn/s/blog_4c98b9600100audq.html (一)为 ...

随机推荐

  1. typename使用在模板中区分static成员和类型

    16.19 编写函数,接受一个容器的引用,打印容器中的元素,使用容器的size_type和size成员来控制打印元素的循环. 16.20 重写上一题的函数,使用begin和end返回的迭代器来控制循环 ...

  2. ctkPlugin插件系统实现项目插件式开发

    插件式开发体会: 自开始写[大话QT]系列就开始接触渲染客户端的开发,说是开发不如更多的说是维护以及重构,在接手这块的东西之前自己还有点犹豫,因为之前我一直认为客户端嘛,没什么技术含量,总是想做比较有 ...

  3. CCProgressTimer用法

    bool HelloWorld::init(){ if ( !CCLayerColor::initWithColor(ccc4(255, 255, 2555, 255))){ return false ...

  4. WTL 自定义 Button类-自绘

    WTL 自绘Button类,支持按钮三种形态,正常模式,hover模式,鼠标按下模式,支持png图片.使用方法很简单: MyButton* pButton = new MyButton;   pBut ...

  5. 根据子级ID获取其所有父级

    当前位置>新闻中心>行业资讯 CLASSID CLASSNAME CLASSPID 1 新闻中心 0 2 行业资讯 1 3 公司新闻 1 4 媒体聚焦 0 当前位置<%=navNam ...

  6. C# 分页

    #region 分页 /// <summary> /// 分页 /// </summary> /// <param name="page">当前 ...

  7. [验证码实现] Captcha 验证码类,一个很个性的验证码类 (转载)

    点击下载 Captcha.zip /// <summary> /// 类说明:条码生成类 /// 编 码 人:苏飞 /// 联系方式:361983679 /// 更新网站:[url=htt ...

  8. [Cache] C#操作缓存--CacheHelper缓存帮助类 (转载)

    点击下载 CacheHelper.zip CacheHelper 缓存帮助类 C#怎么操作缓存 怎么设置和取缓存数据,都在这个类里面呢 下面看一下代码吧 /// <summary> /// ...

  9. UITabBar-UITabBarItem图片的背景颜色属性和文字的颜色大小设置

    UITabBarItem设置的图片选中状态下默认的是蓝色,如何改变它的颜色为图片自带的颜色呢? typedef NS_ENUM(NSInteger, UIImageRenderingMode) { / ...

  10. iphone"此证书是由未知颁发机构签名的"的解决办法

    由于误删除,将开发证书给弄没了,导致Certificates中更新的证书都提示此证书是由未知颁发机构签名的,不能实机调试,解决办法是重新下载AppleWWDRCA.cer 地址是:http://dev ...