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 ...
随机推荐
- C - Lucky Numbers (easy)
Problem description Petya loves lucky numbers. Everybody knows that positive integers are lucky if t ...
- windows服务安装错误 在‘安装’过程发生异常:System.ComponentModel.Win32Exception:系统正在关机
今天安装windows服务的时候先是在本地安装测试通过,但是一到服务器就一直安装失败 在‘安装’过程发生异常:System.ComponentModel.Win32Exception:系统正在关机 然 ...
- Spring Boot (15) pom.xml设置
继承spring-boot-parent 要成为一个spring boot项目,首先就必须在pom.xml中继承spring-boot-starter-parent,同时制定其版本 <paren ...
- Hadoop学习笔记(一)Hadoop的单节点安装
要想深入学习Hadoop分布式文件系统,首先需要搭建Hadoop的实验环境,Hadoop有两种安装模式,即单节点集群模式安装(也称为伪分布式)和完全分布式模式安装,本节只介绍单节点模式的安装,参考官方 ...
- android中复制图片
activity_main.xml中的配置 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi ...
- Android学习——动态注册监听网络变化
新建一个BroadcastTest项目,然后修改MainActivity中的代码,如下: public class MainActivity extends AppCompatActivity { p ...
- Android 第一行代码(第二版)分享
今天从网上好不容易看到了别人转发的pdf版的 第一行代码通过下载我把它存在了百度云里面了与大家共享 http://pan.baidu.com/s/1bRztF4
- AI:IPPR的数学表示-CNN结构进化(Alex、ZF、Inception、Res、InceptionRes)
前言: 文章:CNN的结构分析-------: 文章:历年ImageNet冠军模型网络结构解析-------: 文章:GoogleLeNet系列解读-------: 文章:DNN结构演进Histor ...
- DNN结构演进History—CNN-GoogLeNet :Going Deeper with Convolutions
抄袭了一片文章,进行少量修改:http://www.gageet.com/2014/09203.php 作者:Christian Szegedy( google ) 刘伟(北卡罗来纳 ...
- java输入输入流图解