思路:枚举第一个字符串的位置,然后枚举最长公共前缀的长度,时间即会下降……

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<bitset>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define llson j<<1,l,mid
#define rrson j<<1|1,mid+1,r
#define seed 131
#define INF 0x7fffffff
#define maxn 200105
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ull base[maxn],hash1[maxn],hash2[maxn];
int n,m;
char s1[maxn],s2[maxn];
int judge(int i,int j)
{
int l=0,r=m,mid,ans=0;
while(l<=r)
{
mid=(l+r)>>1;//二分最长公共前缀
if(i+mid-1>n||j+mid-1>m)
{
r=mid-1;
continue;
}
ull a=hash1[i+mid-1]-hash1[i-1]*base[mid];
ull b=hash2[j+mid-1]-hash2[j-1]*base[mid];
if(a==b) l=mid+1,ans=mid;
else r=mid-1;
}
return ans;
}
int main()
{
freopen("1.txt","r",stdin);
int i,t,ii=1,flag;
scanf("%d",&t);
for(i=1,base[0]=1;i<maxn;i++)
base[i]=base[i-1]*seed;
while(t--)
{
scanf("%s%s",s1,s2);
n=strlen(s1),m=strlen(s2);
for(i=1,hash1[0]=0;i<=n;i++)
hash1[i]=hash1[i-1]*seed+s1[i-1]-'a'+1;
for(i=1,hash2[0]=0;i<=m;i++)
hash2[i]=hash2[i-1]*seed+s2[i-1]-'a'+1;
for(i=1;i<=n-m+1;i++)//枚举第一个字符串的起始位置
{
int j=1,k=i,cnt=0;
flag=0;
while(k<=n)
{
int len=judge(k,j);//两个位置的最长公共前缀
k+=len+1;
j+=len+1;
cnt++;
if(cnt==2)
{
if(j>m||j+judge(k,j)>m) flag=1;
break;
}
if(j>m) {flag=1;break;}
}
if(flag) break;
}
if(flag) printf("Case #%d: %d\n",ii++,i-1);
else printf("Case #%d: -1\n",ii++);
}
return 0;
}

BNU 34990 Justice String (hash+二分求LCP)的更多相关文章

  1. BNU 34990 Justice String 2014 ACM-ICPC Beijing Invitational Programming Contest

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34990 DEBUG了非常久,还是legal的推断函数写错了... 此题做法.枚举Stri ...

  2. BNUOJ 34990 Justice String

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

  3. acdream1116 Gao the string!(hash二分 or 后缀数组)

    问题套了一个斐波那契数,归根结底就是要求对于所有后缀s[i...n-1],所有前缀在其中出现的总次数.我一开始做的时候想了好久,后来看了别人的解法才恍然大悟.对于一个后缀来说 s[i...n-1]来说 ...

  4. 后缀数组 hash求LCP BZOJ 4310: 跳蚤

    后缀数组的题博客里没放进去过..所以挖了一题写写 充实下博客 顺便留作板子.. 一个字符串S中 内容不同的子串 有 sigma{n-sa[i]+1-h[i]}   (噢 这里的h[]就是大家熟知的he ...

  5. bzoj1014: [JSOI2008]火星人prefix(splay+hash+二分)

    题目大意:一个字符串三个操作:①求两个后缀的LCP②插入一个字符③修改一个字符. 前几天刚学了hash+二分求lcp,就看到这题. 原来splay还能这么用?!原来splay模板这么好写?我以前写的s ...

  6. bnuoj 34990(后缀数组 或 hash+二分)

    后缀数组倍增算法超时,听说用3DC可以勉强过,不愿写了,直接用hash+二分求出log(n)的时间查询两个字符串之间的任意两个位置的最长前缀. 我自己在想hash的时候一直在考虑hash成数值时MOD ...

  7. 【BZOJ】1014: [JSOI2008]火星人prefix(splay+hash+二分+lcp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1014 题意:支持插入一个字符.修改一个字符,查询lcp.(总长度<=100000, 操作< ...

  8. 【bzoj1014】[JSOI2008]火星人prefix Splay+Hash+二分

    题目描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 8 9 10 ...

  9. LOJ#6387 「THUPC2018」绿绿与串串 / String (Manacher || hash+二分)

    题目描述 绿绿和 Yazid 是好朋友.他们在一起做串串游戏. 我们定义翻转的操作:把一个串以最后一个字符作对称轴进行翻转复制.形式化地描述就是,如果他翻转的串为 RRR,那么他会将前 ∣R∣−1个字 ...

随机推荐

  1. poj 2546(两圆公共面积)

    Circular Area Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5682   Accepted: 2225 Des ...

  2. 【原创】Oracle 11g R2 Client安装配置说明(多图详解)

    1. 准备工作 安装Oracle11gR2client的时候,如果刚从网上下载的Oracle client,可能无法再2008 R2或者2012 R2的服务器上面运行. 报错:[INS-13001]环 ...

  3. Mysql数据库乱码总结

    今天又独到了Mysql乱码问题,过去总是匆匆的解决了就算了.这次我实在受不了了.每次都是迷迷糊糊的改好的. 这次决定好好探索一把,看了很多资料及博客之后才理解了点.先记录下来.如有不对的请指正. 1. ...

  4. (24)C#log4net配置和使用

    一.下载并引用log4 DLL下载  http://logging.apache.org/  找到.net版本的 点击下载 找到编译好的bin 选择net 选择你项目对应的.net framework ...

  5. Codeforces Round #444 (Div. 2)A. Div. 64【进制思维】

    A. Div. 64 time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  6. Unity防破解 —— 加密Dll与Key保护

        在阅读这篇文章之前,我在处理mono加密问题时,也是参考了雨凇的文章,所以建议先看一下雨凇写的关于加密Dll的文章: 1.Unity3D研究院之Android加密DLL与破解DLL .SO 2 ...

  7. JSK 11: 移除数组中的重复元素

    题目描述 给定一个升序排列的数组,去掉重复的数,并输出新的数组的长度. 例如:数组 $A = \{1, 1, 2\}$,你的程序应该输出 $2$ 即新数组的长度,新数组为 $\{1, 2\}$. 要求 ...

  8. sqldeveloper 英文设置

    在软件ide\bin目录下找到sqldeveloper.conf或ide.conf,加入 C:\Program Files (x86)\sqldeveloper\ide\bin AddVMOption ...

  9. [CF3B]Lorry

    题目大意: 有$n(n\leq 10^5)$个物品,背包的容量为$m(m\leq 10^9)$.每个物品有重量$w_i(w_i\in\{1,2\})$和价值$v_i(v_i\leq 10^4)$.问最 ...

  10. 你也许还不知道const_cast,static_cast,dynamic_cast,reinterpret_cast的区别吧?

    [QQ群: 189191838,对算法和C++感兴趣可以进来]       开篇立意: C++中各种转换令人眼花缭乱,看似差不多,实际差很多,而且在当今时间,做一个"差不多先生"其 ...