题目链接: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. Java NIO Buffer说明

    Buffer 有3个重要的参数:位置(position).容量(capactiy).上限(limit) 位置(position): 写:当前缓冲区的位置,将从position的下一个位置写数据. 读: ...

  2. css 引入方式

    css介绍 现在的互联网前端分三层: HTML:超文本标记语言.从语义的角度描述页面结构. CSS:层叠样式表.从审美的角度负责页面样式. JS:JavaScript .从交互的角度描述页面行为 CS ...

  3. Android Activity has leaked window that was originally added

    今天调试程序时log中突然打印这样的错误,但是程序并没有crash,为了不放过一个错误,我决定调查一下. 当时是离开一个activity,然后提示是否退出此界面,接下来就打印此错误: - ::): A ...

  4. VMware中linux安装jdk

    首先安装linux系统 如何将jdk安装包复制到linux中不做概述,可以使用xftp工具,或者Xshell,或者其他方式. 1.下载jdk包:本章使用的为后缀为tar.gz的文件(不需要安装),如j ...

  5. Spark on Yarn集群搭建

    软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这五部机, 每部主机的用户名都为centos ...

  6. 【Linux】计划任务管理crontab、at

    一.计划任务管理 —— crontab 1. crontab 命令 •  按照预先设置的时间周期(分钟.小时.天…… )重复执行用户指定的命令操作,属于周期性计划任务,默认打开“/var/spool/ ...

  7. mssql for VSCode Guide

    前言 mssql 出自微软自己的 Visual Studio Code 开源插件,代码托管于 GitHub 上. 不过需要注意的一点是,使用 insert into 语句新增的数据...中文是会乱码的 ...

  8. js 记住我

    $(function(){ $("#btn_login").click(function() { var anv=$("#an").val(); //登录名 v ...

  9. python迭代器,生成器,推导式

    可迭代对象 字面意思分析:可以重复的迭代的实实在在的东西. list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定) 专业角度: ...

  10. 【转载】java读取.properties配置文件的几种方法

    读取.properties配置文件在实际的开发中使用的很多,总结了一下,有以下几种方法(仅仅是我知道的):一.通过jdk提供的java.util.Properties类.此类继承自java.util. ...