分类

首先我们要对询问分类,如果相差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. C# Winform 最大化后 任务栏还显示解决

    //最大化 this.WindowState = FormWindowState.Maximized; //窗体最大化时 非全屏 不会遮盖任务栏 //去掉标题栏 this.FormBorderStyl ...

  2. unittest 是什么?怎么用?

    unittest单元测试框架详解 https://www.cnblogs.com/fighter007/p/8245063.html unittest最详细的解说 https://www.cnblog ...

  3. Vue项目优化首屏加载速度

    Vue项目部署上线后经常会发现首屏加载的速度特别慢:那么有那写能做的简单优化呢 一.路由的懒加载 路由懒加载也就是 把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件. 结合 ...

  4. POJ 3984 迷宫问题 (BFS + Stack)

    链接 : Here! 思路 : BFS一下, 然后记录下每个孩子的父亲用于找到一条路径, 因为寻找这条路径只能从后向前找, 这符合栈的特点, 因此在输出路径的时候先把目标节点压入栈中, 然后不断的向前 ...

  5. 网络编程:tcp、udp、socket、struct、socketserver

    一.TCP.UDP 一.ARP(Address Resolution Protocol)即地址解析协议,用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址. 二.在网络通信中 ...

  6. python学习笔记--深拷贝与浅拷贝的区别

    首先我们来讲讲我们python中的可变对象和不可变对象: 可变对象:该对象指向内存中的值是可以改变的.实际上是其所指的值直接发生改变,而不是发生复制,或者开辟一个新的地址空间.例如:列表list,字典 ...

  7. maven是干什么的?

    最近在研究后台相关的东西,虽然前端还不是很了解吧~但是计算机一年没写后台代码,我快废掉了呀~emmmmm....他们老是和我说maven,恩恩,那就看看到底是啥?从大神聚集的知乎上拉了一篇过来~存档: ...

  8. js实现滚动条下拉到一定程度固定结算栏

    实现效果如下: js代码实现如下: var a = $("body").height(); var b = $(window).height(); var c = a - b - ...

  9. 刷新PHP缓冲区

    为你的站点加速_php技巧 在当前 PHP 版本的默认配置下,“输出缓冲(Output Buffering)”是被打开的.旧版本则不是这样,在旧版本的 PHP 中,字符串在每次被输出的时候(通过 ec ...

  10. 了解一下JAVA中的NIO模块

    网上资料大把,但要写写代码,我这个年纪的人才有一点点记忆了.. 参考URL: http://blog.csdn.net/wuxianglong/article/details/6612282 pack ...