BNU 34990 Justice String 2014 ACM-ICPC Beijing Invitational Programming Contest
题目链接: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的更多相关文章
- 2014 ACM-ICPC Beijing Invitational Programming Contest
点击打开链接 Happy Reversal Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld J ...
- BNU 34990 Justice String (hash+二分求LCP)
思路:枚举第一个字符串的位置,然后枚举最长公共前缀的长度,时间即会下降-- #pragma comment(linker, "/STACK:1024000000,1024000000&quo ...
- ACM ICPC, JUST Collegiate Programming Contest (2018) Solution
A:Zero Array 题意:两种操作, 1 p v 将第p个位置的值改成v 2 查询最少的操作数使得所有数都变为0 操作为可以从原序列中选一个非0的数使得所有非0的数减去它,并且所有数不能 ...
- ACM ICPC, Amman Collegiate Programming Contest (2018) Solution
Solution A:Careful Thief 题意:给出n个区间,每个区间的每个位置的权值都是v,然后找长度为k的区间,使得这个区间的所有位置的权值加起来最大,输出最大权值, 所有区间不重叠 思路 ...
- 2014 ACM/ICPC 北京邀请赛 部分 题解
题目链接:http://acm.bnu.edu.cn/bnuoj/problem.php?search=2014+ACM-ICPC+Beijing+Invitational+Programming+C ...
- BNUOJ 34990 Justice String
Justice String Time Limit: 2000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java cla ...
- 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 ...
- 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 ...
- 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 ...
随机推荐
- android平台 cocos2d-x 读取相册数据
现已解决 方案如下: 1.使用 jni 调用 java 方法 启动相册选择框2.使用java将获取的图片保存到本地3.使用Cocos2d-x中 CCImage 读取 JAVA代码如下: //启动图片选 ...
- Tour UVA - 1347
John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts vi ...
- 判断wifi是2.4G还是5G
1.WifiInfo 源码: int mFrequency=wifiInfo.getFrequency(); /** * @hide * TODO: makes real freq boundarie ...
- 复习java的例子(第一天)
1. 编写程序:从键盘上读入一个学生成绩, 存放在变量score中,根据score的值输出其对应的成绩等级: score>=90 等级: A 70=<score<90 等级: B 6 ...
- I2C controller core之Bit controller(03)
FPGA proven, AISC proven, I2C controller core from OpenCores http://opencores.org/project,i2c Bit-co ...
- Quartz+Topshelf 作业
小记: 引用Quartz.Topshelf.Topshelf.Quartz 使用方法: http://www.cnblogs.com/mushroom/p/4952461.html http://ww ...
- mvc自定义控件
//自定义一个DatePicker.cshtml文件@helper Init() { <link href="~/Content/mobiscroll.custom-2.5.0.min ...
- js 检查内容是否为空
var NoViods = document.getElementsByClassName("NoVoid"); ; i < NoViods.length; i++) { i ...
- idea中git回滚到指定分支
1.git - > show history,选中回滚的指定版本,右击copy revision number 粘出版本号 2.git -> reset hard 出险新页面之后,选中ha ...
- Microsoft Visual Studio 常用快捷键总结
table tr:nth-child(odd){ background: #FFFFCC; } table tr:nth-child(even){ background: #FFFF99; } Mic ...