• codeforce 62b B. Tyndex.Brome 二分查找 stl lower_bound


    B. Tyndex.Brome
    time limit per test2 seconds
    memory limit per test256 megabytes
    inputstandard input
    outputstandard output
    Tyndex is again well ahead of the rivals! The reaction to the release of Zoozle Chrome browser was the release of a new browser Tyndex.Brome!

    The popularity of the new browser is growing daily. And the secret is not even the Tyndex.Bar installed (the Tyndex.Bar automatically fills the glass with the finest 1664 cognac after you buy Tyndex.Bottles and insert in into a USB port). It is highly popular due to the well-thought interaction with the user.

    Let us take, for example, the system of automatic address correction. Have you entered codehorses instead of codeforces? The gloomy Zoozle Chrome will sadly say that the address does not exist. Tyndex.Brome at the same time will automatically find the closest address and sent you there. That’s brilliant!

    How does this splendid function work? That’s simple! For each potential address a function of the F error is calculated by the following rules:

    for every letter ci from the potential address c the closest position j of the letter ci in the address (s) entered by the user is found. The absolute difference |i - j| of these positions is added to F. So for every i (1 ≤ i ≤ |c|) the position j is chosen such, that ci = sj, and |i - j| is minimal possible.
    if no such letter ci exists in the address entered by the user, then the length of the potential address |c| is added to F.
    After the values of the error function have been calculated for all the potential addresses the most suitable one is found.

    To understand the special features of the above described method better, it is recommended to realize the algorithm of calculating the F function for an address given by the user and some set of potential addresses. Good luck!

    Input
    The first line contains two integers n and k (1 ≤ n ≤ 105, 1 ≤ k ≤ 105). They are the number of potential addresses and the length of the address entered by the user. The next line contains k lowercase Latin letters. They are the address entered by the user (s). Each next i-th (1 ≤ i ≤ n) line contains a non-empty sequence of lowercase Latin letters. They are the potential address. It is guaranteed that the total length of all the lines does not exceed 2·105.

    Output
    On each n line of the output file print a single number: the value of the error function when the current potential address is chosen.

    Please, do not use %lld specificator to read or write 64-bit integers in C++. It is preffered to use cout (also you may use %I64d).

    Examples
    inputCopy
    2 10
    codeforces
    codeforces
    codehorses
    outputCopy
    0
    12
    inputCopy
    9 9
    vkontakte
    vcontacte
    vkontrakte
    vkollapse
    vkrokodile
    vtopke
    vkapuste
    vpechke
    vk
    vcodeforcese
    outputCopy
    18
    14
    36
    47
    14
    29
    30
    0
    84

    这题本身并不难 但是涉及到stl容器中使用lower_bound我希望记录一下,对于stl容器取地址与正常的数组不同,首地址为ve.begin() 末尾地址为ve.end(),对与lower_bound个人感觉是十分好用的函数 可以自己定义排序规则从而改变所要求的数
    1.lower_bound()
    算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。
    2.upper_bound()
    算法返回一个非递减序列[first, last)中第一个大于val的位置。
    lower_bound(首地址,末尾地址,key,cmp);
    在lis的n*logn算法中使用此函数会增强代码可读性
    补充一点:在无法找到比key大的数时,函数返回值为last(末尾地址)

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    #include<iostream>
    using namespace std;
    const int maxn=200005;
    char stdstr[maxn];
    char tmpstr[maxn];
    vector <int>ve[256];
    long long ans=0;
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        scanf("%s",stdstr+1);
        for(int i=1;i<=m;i++)
        {
            ve[stdstr[i]-'a'].push_back(i);
        }
        while(n--)
        {
            ans=0;
            scanf("%s",tmpstr+1);
            int tmplen=strlen(tmpstr+1);
            for(int i=1;i<=tmplen;i++)
            {
                long long tmp=0;
                if(i>m||tmpstr[i]!=stdstr[i])
                {
                    int sub=tmpstr[i]-'a';
                    int pos=lower_bound(ve[sub].begin(),ve[sub].end(),i)-ve[sub].begin();
                    if(ve[sub].size()==0) tmp=tmplen;
                    else if(pos==ve[sub].size()) tmp=i-ve[sub][pos-1];
                    else if(pos==0) tmp=ve[sub][pos]-i;
                    else tmp=min(ve[sub][pos]-i,i-ve[sub][pos-1]);
                    //cout<<i<<" "<<tmp<<endl;
                    ans=ans+(tmp);
                }
            }
            cout<<ans<<endl;
        }
    }
    
  • 相关阅读:
    工作了四五年,感觉技术上依旧长进不大
    Web 性能优化:Preload与Prefetch的使用及在 Chrome 中的优先级
    Fundebug支持浏览器报警
    JavaScript是如何工作的:引擎,运行时和调用堆栈的概述!
    Vue UI:Vue开发者必不可少的工具
    阿里巴巴TXD前端小报
    深入了解浏览器存储:对比Cookie、LocalStorage、sessionStorage与IndexedDB
    JavaScript字符串转数字的5种方法及其陷阱
    灵活使用 console 让 js 调试更简单
    JavaScript大师必须掌握的12个知识点
  • 原文地址:https://www.cnblogs.com/caowenbo/p/11852340.html
Copyright © 2020-2023  润新知