分类

首先我们要对询问分类,如果相差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. js 学习笔记---基本概念

    早已接触javascript多年之后,竟然还有这些概念混淆不清,毫不知情,说出来真实无地自容 ! 1.使用严格模式,"use strict",虽然不适用,但是要知道,以免别人使用时 ...

  2. linux启动时开启screen

    编辑/etc/rc.local 添加 su - ubuntu -c 'screen -dmS ss zserver -p /etc/config'

  3. CSS3 background-origin 属性

    CSS3 background-origin 属性 padding-box 背景图像相对于内边距框来定位. border-box 背景图像相对于边框盒来定位. content-box 背景图像相对于内 ...

  4. C#鸡翁百鸡

    一个for static void Main(string[] args) { int x, y, z; ; x <= ; x++) { - * x) % == ) { y = ( - * x) ...

  5. 8 switch case

    当一个case成立,从这个case向后穿透所有case,即使后面的case条件不成立 包括default,直到程序结束或者遇到break程序才结束. 1.case是常量,且不能重复 2.表达式可以是b ...

  6. cv的期刊和会议

    http://blog.csdn.net/tmylzq187/article/details/51111421

  7. 3.Linux的远程管理及网络下载

    3.1 Linux的远程管理 3.1.1 远程管理概述 什么是远程管理: 1.为什么需要远程管理: 服务器通常是Linux系统,而服务器不可能一直在身边,所以就需要远程来操作服务器 企业中通常需要集群 ...

  8. vue-router的基本使用和配置

    1.在main.js文件中引入相关模块以及组件及实例化vue对象配置选项路由及渲染App组件 默认设置如下: import Vue from 'vue' import App from './App' ...

  9. 00_Rust安装及Hello World

    Rust 官网: https://www.rust-lang.org 版本:nightly.beta.stable 如何设计语言的讨论:https://github.com/rust-lang/rfc ...

  10. CF51F Caterpillar (边双+树形DP)

    题目传送门 题目大意:给你一张n个点m条边的图.每次操作可以把两个点合并成一个(与之相连的边也都要连到新点上).求把图中每个联通块都变成“毛毛虫”的最小操作次数.“毛毛虫”必须是一棵树(可以存在自环) ...