zoukankan      html  css  js  c++  java
  • Newspaper Headline_set(upper_bound)

    Description

    A newspaper is published in Walrusland. Its heading is s1, it consists of lowercase Latin letters. Fangy the little walrus wants to buy several such newspapers, cut out their headings, glue them one to another in order to get one big string. After that walrus erase several letters from this string in order to get a new word s2. It is considered that when Fangy erases some letter, there's no whitespace formed instead of the letter. That is, the string remains unbroken and it still only consists of lowercase Latin letters.

    For example, the heading is "abc". If we take two such headings and glue them one to the other one, we get "abcabc". If we erase the letters on positions 1 and 5, we get a word "bcac".

    Which least number of newspaper headings s1 will Fangy need to glue them, erase several letters and get word s2?

    Input

    The input data contain two lines. The first line contain the heading s1, the second line contains the word s2. The lines only consist of lowercase Latin letters (1 ≤ |s1| ≤ 104, 1 ≤ |s2| ≤ 106).

    Output

    If it is impossible to get the word s2 in the above-described manner, print "-1" (without the quotes). Otherwise, print the least number of newspaper headings s1, which Fangy will need to receive the word s2.

    Sample Input

    Input
    abc
    xyz
    Output
    -1
    Input
    abcd
    dabc
    Output
    2

    【题意】给出两个字符串a,b,a可以接无数个a在每个a后面,问至少接几个a才能出现b,(可以是不连续的)

    【思路】清题,看了大神的代码,顿感厉害,还学了一个upper_bound函数。

    参考:https://www.ocrosoft.com/?p=1362

    1.记录a有的字母,如果b有的字母a没有,那么就是-1。
    2.记录a中每个字母的索引(位置),使用26个set比较方便。
    然后对b的每一个字母进行匹配,同时还要记录一下上一个字母匹配到的位置last(初始化-1)。
    如果下一个字母匹配的时候如果last比这个字母所有的索引都大,说明要再拼接一个a字符串,也就是答案加一。
    否则,选择大于last的第一个位置进行匹配。
    这个操作可以使用upper_bound函数,返回大于last的位置,也可以不用,手动二分。

    #include<iostream>
    #include<stdio.h>
    #include<string>
    #include<set>
    #include<string.h>
    using namespace std;
    const int N=1e6+10;
    int main()
    {
        string a,b;
        set<int>s[30];
        cin>>a>>b;
        int len1=a.size(),len2=b.size();
        for(int i=0;i<len1;i++)
            s[a[i]-'a'].insert(i);
        int k=-1,ans=1;
        for(int i=0;i<len2;i++)
        {
            int tmp=b[i]-'a';
            if(s[tmp].empty())
            {
                printf("-1
    ");
                goto final;
            }
            set<int>::iterator it=s[tmp].upper_bound(k);
            if(it==s[tmp].end())
            {
                k=-1;
                ans++;
            }
            k=*s[tmp].upper_bound(k);
        }
        printf("%d
    ",ans);
        final:
        return 0;
    }
  • 相关阅读:
    ckeditor(在线文本编辑器)使用教程
    一张图轻松搞懂javascript event对象的clientX,offsetX,screenX,pageX区别
    正则表达式
    关于padding与margin的区别
    伪类link,hover,active,visited,focus的区别
    运动框架
    scroll、offset和client的区别
    如何给Sublime安装插件
    获取行间样式与在js中设置样式
    寻找下一个同级元素节点
  • 原文地址:https://www.cnblogs.com/iwantstrong/p/5986157.html
Copyright © 2011-2022 走看看