分类

首先我们要对询问分类,如果相差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. 类QQ账号生成阐述

    具体需求如下: 数字账号从60000到9999999999(类似qq号一样的东东) 用户获取数字账号为随机分配,也可递加分配,需要符合如下规则 特殊账号需要保留,不能分配给用户,比如:112233(连 ...

  2. Resetting the SMC & PRAM

    Resetting the SMC & PRAM on portables with a battery you should not remove on your own 1. Shut d ...

  3. if({1,0}, , )

    =VLOOKUP(F2,IF({1,0},D2:D10,C2:C10),2,),用F2作为查找条件,对D列进行查找,如果改成{0,1}则是对C列为查找范围.返回内存数组,对F2进行精确查找. 为什么写 ...

  4. Docker是什么?可以用Docker做什么?

    作者:刘允鹏 链接:https://www.zhihu.com/question/28300645/answer/67707287 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  5. * 获取页面参数 * @return 参数打印

    /** * 获取页面参数 * @return 参数打印 */ GetUrlParam: function(paraName) { var url = document.location.toStrin ...

  6. Windows系统设置与北京Internet时间同步

    找到提供Ntp服务器的网址:http://support.ntp.org/我从中找到东北大学的: ntp.neu.edu.cn  ( 202.118.1.46 ) 长话短说,下面开始设置: 修改后的值 ...

  7. Spring MVC起步(一)

    下图展示了请求使用Spring MVC所经历的所有站点. 在请求离开浏览器时1,会带有用户请求内容的信息,至少会包含请求的URL.但是还可能包含其他的信息,如用户提交的表单. DispatcherSe ...

  8. eclipse常用设置之自动格式化

    Eclipse 保存文件时自动格式化代码   很多同学不知道Eclipse有个很有用的功能,就是自动格式源代码的功能,一般大家都是直接Ctrl+Shift+F手动格式化,多浪费时间. 其实Eclips ...

  9. C++字符串处理函数

    #include<iostream> #include<stdlib.h> #include<string> #include <assert.h> u ...

  10. Django——12 中间件 上下文处理器 admin后台

    Django 中间件 中间件介绍 中间件的第一个例子 中间件的第二个例子 上下文处理器 admin后台管理   中间件 Django中间件(Middleware)是一个轻量级.底层的“插件”系统,可以 ...