codeforces 1714D. Color with Occurrences

题目大意:

给出一个字符串T,与N 个字符串S, N个字符串取若干个拼成T,可以重合,问最少拼多少次能拼好。 

 分析:

对于每一次拼完,我们定义一个指针bt, 表示下一次从bt开始往两边走,所以定义双指针I, J ,分别从小于bt 方向走以及大于bt方向走,并且必须存在I , J 使得T中I 到J的字串在N个字符串S中存在,并且每一次我都要让J最大,不断搜索,找不到,那就无法操作,打出-1;

//AC code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e6 + 120;
string ts, s[maxn];
struct node{
    int index;
    int station;
}ty;
int main(){
    int q;
    cin>>q;
    while(q--){
        cin>>ts;
        set<string>ser;
        vector<struct node>ver;
        int n;
        cin>>n;
        for(int i = 1; i <= n; i++){
            cin>>s[i];
            //ser.insert(s[i]);
        }
        int bt = 0;
        int f = 0;
        while(bt < ts.length()){
            int tem = -1;
            int id = 1;
            int from = -1;
            f = 0;
            for(int i = bt; i >= 0; i--){
                for(int j = bt; j < ts.length(); j++){
                    if(j - i > 12)   break;
                    for(int k = 1; k <= n; k++){
                        if(ts.substr(i, j - i + 1) == s[k]){
                            f = 1;
                            if(tem < j){
                                tem = j;
                                id = k;
                                from = i;
                            }
                            break; 
                        }    
                    }
                } 
            }
            ty.station = from + 1;
            ty.index = id;
            ver.push_back(ty);
            bt = tem + 1;
            if(f == 0)  break;        
        }
        if(f == 0){
            cout<<"-1"<<endl;
        }else{
            cout<<ver.size()<<endl;
            for(int i = 0; i < ver.size(); i++){
                cout<<ver[i].index<<" "<<ver[i].station<<endl;
            }
        }
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值