• 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;
    }
  • 相关阅读:
    字符的编码
    数据的基本类型和内置方法(二)
    基本的数据类型和内置方法介绍 (一)
    流程运算 if while for
    用户交换 基本数据类型 基本运算符 格式化输出
    机器语言发展简介和变量的介绍
    计算机基础
    Python学习建议和要求总结
    CH135 最大子序和 题解报告
    HRBUST1356 Leyni,罗莉和队列 题解报告
  • 原文地址:https://www.cnblogs.com/iwantstrong/p/5986157.html
Copyright © 2020-2023  润新知