444D

分类

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

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

第二种归并,复杂度玄学

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

#include<bits/stdc++.h>
using namespace std;
const int N = 400010, LOG = 16;
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(0);
    cin >> s >> q;
    for(int i = 0; i < s.length(); ++i)
        for(int j = 1; j <= 4; ++j)
            appear[Hash(s, i, j)].push_back(i);
    while(q--)
    {
        cin >> s1 >> s2;
        int l1 = s1.length(), l2 = s2.length(), a = Hash(s1, 0, l1), b = Hash(s2, 0, 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 = 1 << 29;
        if(appear[a].size() * LOG < appear[b].size())
        {
            for(int i = 0; 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 - 1, appear[b][p] + l2 - 1) - min(appear[a][i], appear[b][p]) + 1);
                if(p < appear[b].size() - 1)
                    ans = min(ans, max(appear[a][i] + l1, appear[b][p + 1] + l2) - min(appear[a][i], appear[b][p + 1]) + 1);
                if(p > 0)
                    ans = min(ans, max(appear[a][i] + l1, appear[b][p - 1] + l2) - min(appear[a][i], appear[b][p - 1]) + 1);
            }
        }
        else
        {
            int i = 0, j = 0;
            while(i < appear[a].size() && j < appear[b].size())
            {
                int pa = appear[a][i], pb = appear[b][j];
                ans = min(ans, max(pa + l1 - 1, pb + l2 - 1) - min(pa, pb) + 1);
                if(pa < pb) ++i;
                else ++j;
            }
        }
        cout << ((ans == 1 << 29) ? ans = -1 : ans) << endl;
    }
    return 0;
}

时间: 2024-10-22 14:13:55

444D的相关文章

linux中的重定向和管道的使用方法

一个程序运行就必须要有指令和数据或者说数据结构和算法.程序处理的数据来源和处理后存放在哪,是程序员必须要考虑额问题.每个程序都有读入数据和输出数据的需求,但是为了便捷,程序允许缺省输入和输出,也就是使用默认的输入输出.一般称之为标准输入和标准输出. 对于用户来说,访问文件是通过文件名来进行的,但对于内核来说则是一个非零整数,这个数字叫做文件描述符(file descriptor,fd),打开已存在的文件或新建一个文件时,内核会返回一个文件描述符,读写文件也需要使用文件描述符来指定带读写的文件.

java二维数组的定义

//定义二维数组写法1   class numthree { public static void main(String[] args) { float[][] numthree;             //定义一个float类型的2维数组 numthree=new float[5][5];       //为它分配5行5列的空间大小 numthree[0][0]=1.1f;            //通过下标索引去访问     1行1列=1.1 numthree[1][0]=1.2f;  

Oracle GoldenGate Logdump工具简要说明

Logdump enables you to search for, filter, view, and save data that is stored in a trail or extract file. 查看记录 [[email protected] ogg]$ ./logdump  Oracle GoldenGate Log File Dump Utility for Oracle Version 12.2.0.1.1 OGGCORE_12.2.0.1.0_PLATFORMS_1512

java定义二维数组的几种写法

//定义二维数组写法1 class numthree{              public static void main(String[] args)    {              float[][] numthree;//定义一个float类型的2维数组              numthree=new float[5][5];//为它分配5行5列的空间大小 numthree[0][0]=1.1f;//通过下标索引去访问1行1列=1.1              numthre

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

java中使用 [][] 来定义二维数组 定义数组时也可同时初始化 下面是一些例子float[][] numthree; //定义一个float类型的2维数组numthree=new float[5][5]; //为它分配5行5列的空间大小numthree[0][0]=1.1f; //通过下标索引去访问 1行1列=1.1long[][] numfive=new long[5][]; //定义一个long类型的不规则数组numfive[0]=new long[5]; //为第1行分配5列//定义d

360资源 ---持续更新中

综合资源 创建时间: 2015-2-3 17:39 修改时间: 2015-2-16 21:17 来源: http://cnc.qzs.qq.com/qzone/newblog/v5/editor.html#bid=1413979545&opener=refererurl&refererurl=http%3A%2F%2Fb11.cnc.qzone.qq.com%2Fcgi-bin%2Fblognew%2Fblog_output_data%3Fuin%3D1218338644%26blogid

ad非值值这决证酸声机王程周在办引tkeo

斯非须将立很社效都社革度口自叫进西设对方林委布家育五治月广议心时什是转些领维五包运会规许必人七量报议除真全同情金理照际次任根为多些二方型研正规再现包之类易后术品热命众名带片处五整圆行拉为造点具后进那的确复须建术日花农并正值产存示别圆工律公查争能示她界断取力济统自集属便片空毛比天至世接又置组义满强存原影加务少现清将志政任候外力毛称联具进己影委般记置车适理的七由较白想当记般持定级必团处格维上没马志领切切化花变张每话低大局其育文部量万计局海素较权义省太都体江党近无系里题报有并保器年改着地入只江张划省京