分类

首先我们要对询问分类,如果相差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. 【译】x86程序员手册17-第6章保护

    Chapter 6 Protection 第六章 保护 6.1 Why Protection? 为什么要保护? The purpose of the protection features of th ...

  2. 在CentOS6,CentOS7安装 Let'sEncrypt 免费SSL安全证书

    相对来说,个人网站建立SSL是昂贵的,而且往往过程繁琐.一个标准的2048位证书费用至少150美元/年,网站除了要支付一笔昂贵的费用.重新配置Web服务器,并需要解决大量的配置错误.这让广大中小网站望 ...

  3. php 在Linux下的安装

    1.获取php源码 wget http://cn2.php.net/get/php-5.6.6.tar.gz/from/this/mirror mv mirror php-5.6.6.tar.gz t ...

  4. picturebox中添加图片

    private void Form1_Load(object sender, EventArgs e) { radioButton2.Checked = true; } private void ra ...

  5. char如何储存3个字节或者4个字节

    1.char字符存储的是Unicode编码的代码点,也就是存储的是U+FF00这样的数值,然而我们在调试或者输出到输出流的时候,是JVM或者开发工具按照代码点对应的编码字符输出的. 2. 所以虽然UT ...

  6. ubuntu18.04安装chrome浏览器

    前几天把系统弄崩溃了,弄了好久也没弄好,索性直接装18.04,下面是安装chrom浏览器的步骤,网络上照着16.04安装的,应该是一样的 启动终端. 输入以下命令: sudo wget http:// ...

  7. hdu2006 求奇数的乘积【C++】

    求奇数的乘积 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  8. bupt summer training for 16 #6 ——图论

    https://vjudge.net/contest/174020 A.100条双向边,每个点最少连2个边 所以最多100个点,点的标号需要离散化 然后要求恰好经过n条路径 快速幂,乘法过程就是flo ...

  9. hdu 3549 最大流

    #include<stdio.h> #include<string.h> #include<queue> #include<iostream> usin ...

  10. python正则匹配——中文字符的匹配

    # -*- coding:utf-8 -*- import re '''python 3.5版本 正则匹配中文,固定形式:\u4E00-\u9FA5 ''' words = 'study in 山海大 ...