题目链接: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. Win7的虚拟Wi-Fi

    前几天无意中发现,Win7的硬件驱动里有个叫Microsoft Virtual WiFi Miniport Adapter的东东,从网上查了一下,可以用来组建临时网络,共享Internet.一块无线网 ...

  2. E - A Trivial Problem(求满足x!的尾数恰好有m个0的所有x)

    Problem description Mr. Santa asks all the great programmers of the world to solve a trivial problem ...

  3. (转载)实例详解Android快速开发工具类总结

    实例详解Android快速开发工具类总结 作者:LiJinlun 字体:[增加 减小] 类型:转载 时间:2016-01-24我要评论 这篇文章主要介绍了实例详解Android快速开发工具类总结的相关 ...

  4. js 图片轮播代码编辑

    图片轮播,将几张图片统一放在展示平台 banner上,通过banner移动将图片轮流播放. <script>// 取对象 var btn_l = document.getElementsB ...

  5. Morse理论:拓扑不变性特征匹配原理

    设计精美的宽基线双目相机镇文 Mo'ersi lilun莫尔斯理论(卷名:数学) Morse theory 微分拓扑的一个重要分支.通常是指两部分内容:一部分是微分流形上可微函数的莫尔斯理论,即临界点 ...

  6. Newtonsoft.Json 处理日期格式

    Newtonsoft.Json.Converters.IsoDateTimeConverter iso = new Newtonsoft.Json.Converters.IsoDateTimeConv ...

  7. POST请求成功,但接口返回数据不正确

    事件:使用Jmeter做APP的搜索接口测试,请求成功了,但无论keyword是什么“内容”(这里的内容是带引号的哦),接口返回的内容都是:未匹配到搜索结果 排查问题: keyword=“世界” st ...

  8. Java中面向对象三大特性之——继承

    继承的概述 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可. 现实生活中继承:子承父业,用来描述事物之间的关系 代码中继承:就是用 ...

  9. LINUX命令行如何查看memcache运行状态

    (附加)如何查看memcache服务器端版本:  ./memcached  -h memcache的运行状态可以方便的用 stats 命令显示. 首先用telnet 127.0.0.1 11211这样 ...

  10. BZOJ 3943: [Usaco2015 Feb]SuperBull 最小生成树

    Code: // luogu-judger-enable-o2 #include<bits/stdc++.h> #define setIO(s) freopen(s".in&qu ...