求最大的公共前缀;

用后缀数组做;

其实暴力也可以过;

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 2009
using namespace std; int s[maxn];
int sa[maxn],t[maxn],t2[maxn],c[maxn],n; void build_sa(int m)
{
int *x=t,*y=t2;
for(int i=; i<m; i++)c[i]=;
for(int i=; i<n; i++)c[x[i]=s[i]]++;
for(int i=; i<m; i++)c[i]+=c[i-];
for(int i=n-; i>=; i--)sa[--c[x[i]]]=i;
for(int k=; k<=n; k<<=)
{
int p=;
for(int i=n-k; i<n; i++)y[p++]=i;
for(int i=; i<n; i++)if(sa[i]>=k)y[p++]=sa[i]-k;
for(int i=; i<m; i++)c[i]=;
for(int i=; i<n; i++)c[x[y[i]]]++;
for(int i=; i<m; i++)c[i]+=c[i-];
for(int i=n-; i>=; i--)sa[--c[x[y[i]]]]=y[i];
swap(x,y);
p=;
x[sa[]]=;
for(int i=; i<n; i++)
x[sa[i]]=y[sa[i-]]==y[sa[i]]&&y[sa[i-]+k]==y[sa[i]+k]?p-:p++;
if(p>=n)break;
m=p;
}
} int rank[maxn],height[maxn];
void getheight()
{
int k=;
for(int i=; i<n; i++)rank[sa[i]]=i;
for(int i=; i<n; i++)
{
if(k)k--;
int j=sa[rank[i]-];
while(s[i+k]==s[j+k])k++;
height[rank[i]]=k;
}
} bool check(int mid)
{
int mi=,ma=-;
for(int i=; i<n; i++)
{
if(height[i]>=mid)
{
mi=min(mi,sa[i]);
ma=max(ma,sa[i]);
}
else
{
if(ma-mi>=mid)return ;
mi=ma=sa[i];
}
}
if(ma-mi>=mid)return ;
return ;
} bool isbad[];
char bad[],good[];
int main()
{
int tt,r,ca=;
scanf("%d",&tt);
getchar();
while(tt--)
{
memset(isbad,,sizeof isbad);
gets(good);
gets(bad);
int l=strlen(bad);
for(int i=; bad[i]!='\0'; i++)
isbad[bad[i]]=;
n=strlen(good);
while(n>&&good[n-]==' ')
{
good[n-]='\0';
--n;
}
int xx='z';
for(int i=; good[i]!='\0'; i++)
{
if(isbad[good[i]])s[i]=xx++;
else s[i]=good[i];
}
s[n]=;
if (n<=)
{
printf("Case #%d: 0\n",ca++);
continue;
}
n++;
build_sa(xx+);
getheight();
l=,r=n>>;
while(l<=r)
{
int mid=(l+r)>>;
if(check(mid))l=mid+;
else r=mid-;
}
printf("Case #%d: %d\n",ca++,r);
}
return ;
}

UVA 11739 Giving Candies的更多相关文章

  1. UVA - 10118 Free Candies 记忆化搜索经典

    思路:d[a][b][c][d]表示从已经第一个篮子取了a颗糖,第二个取了b颗糖,第三个取了c颗糖,第四个取了d颗糖最多还能够获得多少糖果.首先明白一个问题:如果能分别取a,b,c,d个,不论如何取, ...

  2. UVA 10118 Free Candies

    https://vjudge.net/problem/UVA-10118 题目 桌上有4堆糖果,每堆有$N$($N\leqslant 40$)颗.有个熊孩子拿了个可以装5颗糖的篮子,开始玩无聊的装糖游 ...

  3. UVa 10118 Free Candies (记忆化搜索+哈希)

    题意:有4堆糖果,每堆有n(最多40)个,有一个篮子,最多装5个糖果,我们每次只能从某一堆糖果里拿出一个糖果,如果篮子里有两个相同的糖果, 那么就可以把这两个(一对)糖果放进自己的口袋里,问最多能拿走 ...

  4. UVA - 10118 Free Candies(免费糖果)(dp---记忆化搜索)

    题意:桌上有4堆糖果,每堆有N(N<=40)颗.佳佳有一个最多可以装5颗糖的小篮子.他每次选择一堆糖果,把最顶上的一颗拿到篮子里.如果篮子里有两颗颜色相同的糖果,佳佳就把它们从篮子里拿出来放到自 ...

  5. [LeetCode] Candy 分糖果问题

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

  6. 6 Candy_Leetcode

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

  7. Leetcode Candy

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

  8. leetcode bugfree note

    463. Island Perimeterhttps://leetcode.com/problems/island-perimeter/就是逐一遍历所有的cell,用分离的cell总的的边数减去重叠的 ...

  9. LeetCode 135 Candy(贪心算法)

    135. Candy There are N children standing in a line. Each child is assigned a rating value. You are g ...

随机推荐

  1. 어느 도시 보유 하 면 사랑 이다(事態が発生すれば、ある都市の恋はしません)【Si les villes un amour】{If have love in a city}

    如果在北京拥有爱情 半夜在簋街喝啤酒 吃小龙虾 在后海的苦情歌声里 搂着你数那四合院的瓦片 如果在上海拥有爱情 去外滩手挽手 吹吹风 坐一下午 去城隍庙尝试各种小吃 嘲笑你嘴角残余的糯米糕 如果在杭州 ...

  2. hihocoder 1163 博弈游戏·Nim游戏

    1163 : 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob. Alice与Bob总是在进行各种各样的 ...

  3. otf字体转ttf字体

    可以使用Font creator进行转换字体. 绿色版下载链接 Font Creator(字体编辑软件下载)V9.0官方版 或者我的百度云:http://pan.baidu.com/s/1c1jjfm ...

  4. jQuery+php实现ajax文件即时上传

    很多项目中需要用到即时上传功能,比如,选择本地图片后,立即上传并显示图像.本文结合实例讲解如何使用jQuery和PHP实现Ajax即时上传文件的功能,用户只需选择本地图片确定后即实现上传,并显示上传进 ...

  5. hadoop命令报错:权限问题

    root用户执行hadoop命令报错: [root@vmocdp125 conf]# hadoop fs -ls /user/ [INFO] 17:50:42 main [RetryInvocatio ...

  6. SQL Server高级内容之表表达式和复习

    1. 表表达式 (1) 将表作为一个源或将查询的一个结果集作为一个源,对源做处理,然后得到一个新的数据源,对其进行查询.  (2)表表达式放在from子句中 (3)派生表,将表的查询得到的结果集作为一 ...

  7. 第六篇、git常用的命令

    1.oscine git服务器地址 https://git.oschina.net/ 2.帐号:18775134221@163.com 密码:562011 3.创建私有的仓库 4.使用命令 4.1 配 ...

  8. JavaScript中关于创建对象的笔记

    1,最基本的两种创建对象的方式:构造函数|| 字面量 构造函数: var person = new Object(); person.name = "chen1zee1"; per ...

  9. Java实战之04JavaWeb-05事务和连接池

    一.事务部分 1.事务的简介 做一件事情,这个一件事情中有多个组成单元,这个多个组成单元要不同时成功,要不同时失败.A账户转给B账户钱,将A账户转出钱的操作与B账户转入钱的操作绑定到一个事务中,要不这 ...

  10. java.lang.StringBuffer源码分析

    StringBuffer是一个线程安全的可变序列的字符数组对象,它与StringBuilder一样,继承父类AbstractStringBuilder.在多线程环境中,当方法操作是必须被同步,Stri ...