HNUSTOJ-1543 字符串的运算再现

Posted Pretty9

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HNUSTOJ-1543 字符串的运算再现相关的知识,希望对你有一定的参考价值。

 

1543: 字符串的运算再现

时间限制: 1 Sec  内存限制: 128 MB
提交: 34  解决: 7
[提交][状态][讨论版]

题目描述

我们对字符串 S 做了以下定义:
1. S ^ k表示由k个字符串S构成的新字符串。 例如, S = "abc", k = 3, 则S ^ k  =  "abcabcabc"
2. Subsequence(S) 表示由字符串S的所有非空子序列构成的字符串集合。例如, S = "abc", 则Subsequence(S) = {"a", "b", "c", "ab", "ac", "bc", "abc"}
现在, 给你2个字符串S和T, 希望你能找到最小的k, 满足T ∈Subsequence(S ^ k)

 

输入

输入只有2行, 分别为字符串S和T (1 <= |S|, |T| <= 100,000), 输入保证字符串S和T只由小写字母构成。

 

输出

输出最小的k, 满足T ∈Subsequence(S ^ k), 若不存在这样的k, 则输出-1

 

样例输入

abc
abacbc

样例输出

3
#pragma GCC diagnostic error "-std=c++11"
#include <bits/stdc++.h>
#define _ ios_base::sync_with_stdio(0);cin.tie(0);
#include <typeinfo>


using namespace std;
const int N =  100000 + 5;

char s[N], t[N];


void Init(int * a, int n){ for(int i = 0; i < n; i++) a[i] = 0;}
int Work(){
    int lens = strlen(s), lent = strlen(t);
    set<int> next[26];
    int vis[26]; Init(vis, 26);
    for(int i = 0 ; i < lens; i++)
        vis[s[i] - a] = 1, next[s[i]-a].insert(i);

    for(int i = 0; i < lent; i++) if(!vis[t[i]-a]) return -1;

    int cur = 0, k = 1;

    set<int>::iterator it;

    for(int i = 0; i < lent; i++){
        int p = t[i] - a;
        if((it = next[p].lower_bound(cur)) != next[p].end()) cur = (*it) + 1;
        else cur = 0, k++, i--;
    }
    return k;
}
int main(){ _
    while(cin >> s >> t){
        cout << Work() << endl;
    }
}

 

以上是关于HNUSTOJ-1543 字符串的运算再现的主要内容,如果未能解决你的问题,请参考以下文章

10个JavaScript代码片段,使你更加容易前端开发。

javascript 在ie8中报“缺少标识符字符串或数字“问题再现:

Java版ojday18统计每个月兔子的总数字符串通配符

张国荣《热·情》演唱会再现荧幕:AI修复解锁的经典与视听生活

安防业再现人工智能风波之真假AI人形检测

微信又被玩坏了!Xss神奇再现!