分类

首先我们要对询问分类,如果相差log级别就第一种询问,否则第二种。

第一种直接暴力lower_bound,复杂度玄学

第二种归并,复杂度玄学

但是就是过了。感觉很容易卡。

#include<bits/stdc++.h>
using namespace std;
const int N = , LOG = ;
int q, cnt;
string s, s1, s2;
map<string, int> mp;
vector<int> appear[N];
map<pair<int, int>, int> mem;
int Hash(string &s, int pos, int len)
{
string ss = s.substr(pos, len);
if(mp.find(ss) == mp.end())
mp[ss] = ++cnt;
return mp[ss];
}
int main()
{
ios :: sync_with_stdio(false);
cin.tie();
cin >> s >> q;
for(int i = ; i < s.length(); ++i)
for(int j = ; j <= ; ++j)
appear[Hash(s, i, j)].push_back(i);
while(q--)
{
cin >> s1 >> s2;
int l1 = s1.length(), l2 = s2.length(), a = Hash(s1, , l1), b = Hash(s2, , l2);
if(l1 > l2)
{
swap(l1, l2);
swap(a, b);
}
if(mem[make_pair(a, b)])
{
cout << mem[make_pair(a, b)] << endl;
continue;
}
int &ans = mem[make_pair(a, b)];
ans = << ;
if(appear[a].size() * LOG < appear[b].size())
{
for(int i = ; i < appear[a].size(); ++i)
{
int p = lower_bound(appear[b].begin(), appear[b].end(), appear[a][i]) - appear[b].begin();
if(p != appear[b].size())
ans = min(ans, max(appear[a][i] + l1 - , appear[b][p] + l2 - ) - min(appear[a][i], appear[b][p]) + );
if(p < appear[b].size() - )
ans = min(ans, max(appear[a][i] + l1, appear[b][p + ] + l2) - min(appear[a][i], appear[b][p + ]) + );
if(p > )
ans = min(ans, max(appear[a][i] + l1, appear[b][p - ] + l2) - min(appear[a][i], appear[b][p - ]) + );
}
}
else
{
int i = , j = ;
while(i < appear[a].size() && j < appear[b].size())
{
int pa = appear[a][i], pb = appear[b][j];
ans = min(ans, max(pa + l1 - , pb + l2 - ) - min(pa, pb) + );
if(pa < pb) ++i;
else ++j;
}
}
cout << ((ans == << ) ? ans = - : ans) << endl;
}
return ;
}

444D的更多相关文章

  1. java怎么定义一个二维数组?

    java中使用 [][] 来定义二维数组 定义数组时也可同时初始化下面是一些例子float[][] numthree; //定义一个float类型的2维数组numthree=new float[5][ ...

  2. 【转】java中定义二维数组的几种写法

    原文链接 注:以下的 type[][] var 也可以这样申明 type var[][] type为数组的类型,var为变量名 写法一:行列固定的数组 //定义二维数组写法1 class Test { ...

  3. web前端-框架jquery

    1.jquery库 就是js的库 ,可以通过jquery语法简化js操作 ,如文档遍历 ,文档操作 ,事件处理 ,动画js定时器等等 2.引用 下载:https://www.bootcdn.cn/jq ...

  4. 【转载】C#使用Math.Floor方法来向下取整

    在C#的数值运算中,有时候需要对计算结果舍去小数位保留整数位向下取整即可,此时就可使用内置方法Math.Floor来实现向下取整操作,Math.Floor方法将舍去小数部分,保留整数.Math.Flo ...

随机推荐

  1. abstract class和interface 抽象类与接口类的区别

    抽象类与类型定义相关: 接口类与行为规范相关: 接口类不是类型. 抽象类:是不完整的类,函数实现未定义:可以继承,不可以实例化. 接口类:接口类不是类:是类间交互的规范:不能继承.不能实例化,只能实现 ...

  2. yum插件

    参考文章: http://www.linuxfly.org/post/297/ [root@dnstest07.tbc /home/ahao.mah] #rpm -qa |grep yum yum-p ...

  3. [C++] 配平化学方程式算法的封装

    有人已经实现了配平的方法,在此不再重复介绍. https://www.cnblogs.com/Elfish/p/7631603.html 但是,上述的方法所提供的代码还是存在着问题,需要进一步修改. ...

  4. P4047 [JSOI2010]部落划分(最小生成树)

    题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成为谜团了——聪 ...

  5. uva10082 WERTYU (Uva10082)

    A common typing error is to place the hands on the keyboard one row to the right of the correct posi ...

  6. 如何将变量id添加到jquery的选择器中

    今天在做广州仲裁委员会的系统时这样的一个需求,需要在页面一加载的时候查询各个项目的案件数,这里有很多个项目,一开始我是这样写的: 代码如下: $.get(assignedCaseUrl,functio ...

  7. PatentTips - Fair scalable reader-writer mutual exclusion

    BACKGROUND The present invention relates generally to multithreaded programming and, more specifical ...

  8. hdu_1285_确定比赛名次_201312081335

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  9. ZooKeeper的配置文件优化性能(转)

    一.前言 ZooKeeper的功能特性通过ZooKeeper配置文件来进行控制管理( zoo.cfg配置文件). ZooKeeper这样的设计其实是有它自身的原因的.通过前面对ZooKeeper的配置 ...

  10. not in 和 <> 不走索引

    首先我们要知道的一点就是CBO的代码oracle是不会对我们公开的,起码现在是.所以本文中的结论不一定适用所有的版本.在应用本文的结论之前最好先试一下. ok 下面就是本文的结论,当你在where语句 ...