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

#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. openstack 监控 - 整合nagios 调研总结

    https://blog.csdn.net/soft_lawrency/article/details/8590562

  2. Linq GroupJoin , Join

    static void Main(string[] args) { List<Person> persons = new List<Person> { }, }, }; Lis ...

  3. outlook preview setup

    ow To Show Subject Above/Below Sender In Mail List In Outlook? Normally in the compact view of a mai ...

  4. alter table锁表,MySQL出现Waiting for table metadata lock的场景浅析及解决方案

    在修改/增加表字段的时候,发现很慢, show processlist; 时, Waiting for table metadata lock 能一直锁很久. 官网的一段话,可以理解下 http:// ...

  5. delphi程序全屏显示无标题栏覆盖整个屏幕

    delphi 简单实现程序全屏显示无标题栏,覆盖整个屏幕,这个在做工控机或屏保时有用的,具体代码如下,感兴趣的朋友可以参考下哈 delphi 程序全屏显示无标题栏,覆盖整个屏幕,这个在做工控机或屏保时 ...

  6. C++STL中的向量vector

    #include<iostream>#include<vector>#include<algorithm>using namespace std;typedef v ...

  7. nginx服务器设置path_info模式

    1.find / -name nginx.conf找到nginx配置文件 2. ## The default server#server { listen 80; #填写自己的域名 server_na ...

  8. django admin后台编辑页面 显示数据公式

    先用django markdownx进行实时预览, 然后在 /Library/Python/2.7/site-packages/django/contrib/admin 这个目录下,加入 <sc ...

  9. python装饰器的作用

    常见装饰器:内置装饰器:类装饰器.函数装饰器.带参数的函数装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常 ...

  10. codeforces559A--Gerald&#39;s Hexagon(计算几何)

    A. Gerald's Hexagon time limit per test 2 seconds memory limit per test 256 megabytes input standard ...