题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34990

DEBUG了非常久,还是legal的推断函数写错了...

此题做法。枚举String1的起始位置,对string2的长度进行二分。求出最长公共前缀,然后跳过一个不匹配的地方,然后继续二分匹配,再去掉一个不匹配的地方

//700-800MS   对于hash而言已经算比較快了

以下的是自己又一次写的:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <cmath>
#include <map>
#include <queue>
using namespace std; #define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdin) const ull B=31;
const int MAXN = 100000+100;
char a[MAXN],b[MAXN];
ull ah[MAXN],bh[MAXN],base[MAXN]; int n,m; int Find(int i, int j)
{
int up=m+1-j,down=0,mid;//二分的是长度////
ull tmpa,tmpb;
while(up>down+1)
{
mid=(up+down)/2;
tmpa=(i==0)? ah[i+mid-1]:ah[i+mid-1]-ah[i-1]*base[mid];///
tmpb=(j==0)?bh[j+mid-1]:bh[j+mid-1]-bh[j-1]*base[mid];///
if(tmpa == tmpb)down=mid;
else up=mid;
}
return down;
} int legal(int st)
{
int prelen=0,j=0,use=0;
for(int i=st;;)
{
prelen=Find(i,j);
i+=prelen+1;
j+=prelen+1;
use++;
if(j>=m)return 1;
if(use == 2)
{
if(j>=m)return 1;
if(j+Find(i,j)>=m)return 1;
return 0;
}
if(i>=n && j<m)return 0;
}
} int solve()
{
ah[0]=a[0],bh[0]=b[0],a[n+1]=0,b[m+1]=0;
for(int i=1;i<=m;i++)
bh[i]=bh[i-1]*B+b[i];
for(int i=1;i<=n;i++)
ah[i]=ah[i-1]*B+a[i];
for(int i=0;i<=n-m;i++)
{
if(legal(i))return i;
}
return -1;
} int main()
{
//IN("BNUhash.txt");
int ncase;
scanf("%d",&ncase);
base[0]=1;
rep(i,1,MAXN)
base[i]=base[i-1]*B;
for(int ic=1;ic<=ncase;ic++)
{
scanf("%s%s",a,b);
n=strlen(a);
m=strlen(b);
printf("Case #%d: %d\n",ic,solve());
}
return 0;
}

以下的legal參考了队友的,。,事实上不该看人家代码太多啊。自己写思路更清晰,

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <cmath>
#include <map>
#include <queue>
using namespace std; #define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdin) const ull B=31;
const int MAXN = 100000+100;
char a[MAXN],b[MAXN];
ull ah[MAXN],bh[MAXN],base[MAXN]; int n,m; int Find(int i, int j)
{
int up=m+1-j,down=0,mid;//二分的是长度////
ull tmpa,tmpb;
while(up>down+1)
{
mid=(up+down)/2;
tmpa=(i==0)?ah[i+mid-1]:ah[i+mid-1]-ah[i-1]*base[mid];///
tmpb=(j==0)? bh[j+mid-1]:bh[j+mid-1]-bh[j-1]*base[mid];///
if(tmpa == tmpb)down=mid;
else up=mid;
}
return down;
} int legal(int st)
{
int prelen=0,j=0,use=0;
for(int i=st;i<n && use<2 && j<m-1;i++,j++)//i<=n?
{
prelen=Find(i,j);
i+=prelen;//
j+=prelen;//
use++;//记录二分的次数
if(use>=2 && j<m-1)//又一次写下
{
prelen=Find(i+1,j+1);
j+=prelen; //
if(j>=m-1)return 1; //
else return 0;
}
}
return 1;//////
} int solve()
{
ah[0]=a[0],bh[0]=b[0],a[n+1]=0,b[m+1]=0;
for(int i=1;i<=m;i++)
bh[i]=bh[i-1]*B+b[i];
for(int i=1;i<=n;i++)
ah[i]=ah[i-1]*B+a[i];
for(int i=0;i<=n-m;i++)
{
if(legal(i))return i;
}
return -1;
} int main()
{
//IN("BNUhash.txt");
int ncase;
scanf("%d",&ncase);
base[0]=1;
rep(i,1,MAXN)
base[i]=base[i-1]*B;
for(int ic=1;ic<=ncase;ic++)
{
scanf("%s%s",a,b);
n=strlen(a);
m=strlen(b);
printf("Case #%d: %d\n",ic,solve());
}
return 0;
}

BNU 34990 Justice String 2014 ACM-ICPC Beijing Invitational Programming Contest的更多相关文章

  1. 2014 ACM-ICPC Beijing Invitational Programming Contest

    点击打开链接 Happy Reversal Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      J ...

  2. BNU 34990 Justice String (hash+二分求LCP)

    思路:枚举第一个字符串的位置,然后枚举最长公共前缀的长度,时间即会下降-- #pragma comment(linker, "/STACK:1024000000,1024000000&quo ...

  3. ACM ICPC, JUST Collegiate Programming Contest (2018) Solution

    A:Zero Array 题意:两种操作, 1 p v  将第p个位置的值改成v  2  查询最少的操作数使得所有数都变为0  操作为可以从原序列中选一个非0的数使得所有非0的数减去它,并且所有数不能 ...

  4. ACM ICPC, Amman Collegiate Programming Contest (2018) Solution

    Solution A:Careful Thief 题意:给出n个区间,每个区间的每个位置的权值都是v,然后找长度为k的区间,使得这个区间的所有位置的权值加起来最大,输出最大权值, 所有区间不重叠 思路 ...

  5. 2014 ACM/ICPC 北京邀请赛 部分 题解

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem.php?search=2014+ACM-ICPC+Beijing+Invitational+Programming+C ...

  6. BNUOJ 34990 Justice String

    Justice String Time Limit: 2000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java cla ...

  7. HDU 5000 2014 ACM/ICPC Asia Regional Anshan Online DP

    Clone Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other) Total Submiss ...

  8. hdu 5016 点分治(2014 ACM/ICPC Asia Regional Xi'an Online)

    Mart Master II Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  9. ACM ICPC Central Europe Regional Contest 2013 Jagiellonian University Kraków

    ACM ICPC Central Europe Regional Contest 2013 Jagiellonian University Kraków Problem A: Rubik’s Rect ...

随机推荐

  1. B - Lucky Division

    Problem description Petya loves lucky numbers. Everybody knows that lucky numbers are positive integ ...

  2. 利用windbg获取dump的dll文件

    根据堆栈对应的地址查找其对应的Module ID,然后将对应的Module保存. !IP2MD 命令从托管函数中获取 MethodDesc 结构地址. !dumpmodule 1caa50 下面的命令 ...

  3. MVC微信浏览器图片上传(img转Base64)

    因公司业务需要,需要做一个微信公众号里的图片上传功能,主要用到的技术就是 img转base64 上到服务器 话不多说, 贴代码 先看前端显示出来的东西 OK 图片不重要,看代码 <!--微信图片 ...

  4. SharedPreferences用法

    SharedPreferences是Android四种数据存储技术中的一种,它是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信 息,其对 ...

  5. AndroidStudio怎样导入library项目库

    先打开一个Project,然后将libraryr的项目作为module进行导入: File菜单->import module菜单 以上只是导入进来,还没有作为与project真正有效的一部分.需 ...

  6. SQL Server对数据进行删除

    SQL Server对数据进行删除,把页面的信息从数据库删除. auto"> <tr style="background:red"> <td> ...

  7. Caffe2:使用Caffe构建LSTM网络

    前言: 一般所称的LSTM网络全叫全了应该是使用LSTM单元的RNN网络. 原文:(Caffe)LSTM层分析 入门篇:理解LSTM网络 LSTM的官方简介: http://deeplearning. ...

  8. ROS:使用ubuntuKylin17.04安装ROS赤xi龟

    使用ubuntuKylin17.04安装 参考了此篇文章:SLAM: Ubuntu16.04安装ROS-kinetic 重复官方链接的步骤也没有成功. 此后发现4.10的内核,不能使用Kinetic. ...

  9. C# 从小到大排列

    "; ; var ss = ""; ;i<str.Length;i++) { var s0 = str[i].ToString(); var s1 = (js).T ...

  10. PAT_A1151#LCA in a Binary Tree

    Source: PAT A1151 LCA in a Binary Tree (30 分) Description: The lowest common ancestor (LCA) of two n ...