zcmu 2193: Newspaper Headline

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41117236/article/details/82944440

【题目】

2193: Newspaper Headline

【题意】

给出模式串和主串,问需要多少个模式串拼接删去多余部分可得到主串。若不存在答案则输出-1。

【思路】

若是主串中出现模式串中没有的字母,则不存在。

模拟匹配,统计次数。

【代码】

#include <cstdio> 
#include <cstdlib> 
#include <cstring> 
#include <cmath> 
#include <cstdlib> 
#include <map> 
#include <set> 
#include <list> 
#include <vector> 
#include <stack> 
#include <queue> 
#include <algorithm> 
#include <iostream> 
#define mem(a) memset(a,0,sizeof(a)) 
#define go(i,a,b) for(int i=a;i<=b;i++) 
#define og(i,a,b) for(int i=a;i>=b;i--) 
using namespace std; 
const int maxn=10000; 
const int inf=0x3f3f3f3f; 
typedef long long ll; 
typedef unsigned long long ull; 
main() 
{ 
    set <int> a[30]; 
    string s1,s2; cin>>s1>>s2; 
    int l1=s1.size(),l2=s2.size(); 
    go(i,0,l1-1) a[s1[i]-'a'].insert(i); 
    int f=1,n=-1,ans=1; 
    go(i,0,l2-1) 
    { 
        int m=s2[i]-'a'; 
        if(a[m].empty()) f=0; //判断是否可行
        set <int> :: iterator it=a[m].upper_bound(n); 
        if(it==a[m].end()) n=-1,ans++; //若匹配到模式串末尾,更新位置n
        n=*a[m].upper_bound(n); 
    } 
    if(f) cout<<ans<<endl; 
    else cout<<"-1\n"; 
} 

猜你喜欢

转载自blog.csdn.net/qq_41117236/article/details/82944440