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
abc
xyz
-1
abcd
dabc
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; }