Codeforces Round #338 (Div. 2) C. Running Track

本文详细解析了如何通过暴力模拟的方法解决 Codeforces 615C 题目,涉及字符串操作与最小片段数量的求解。通过实例演示,帮助读者理解解题思路并掌握相关技巧。
部署运行你感兴趣的模型镜像

C. Running Track
time limit per test1 second
memory limit per test512 megabytes
inputstandard input
outputstandard output
A boy named Ayrat lives on planet AMI-1511. Each inhabitant of this planet has a talent. Specifically, Ayrat loves running, moreover, just running is not enough for him. He is dreaming of making running a real art.

First, he wants to construct the running track with coating t. On planet AMI-1511 the coating of the track is the sequence of colored blocks, where each block is denoted as the small English letter. Therefore, every coating can be treated as a string.

Unfortunately, blocks aren’t freely sold to non-business customers, but Ayrat found an infinite number of coatings s. Also, he has scissors and glue. Ayrat is going to buy some coatings s, then cut out from each of them exactly one continuous piece (substring) and glue it to the end of his track coating. Moreover, he may choose to flip this block before glueing it. Ayrat want’s to know the minimum number of coating s he needs to buy in order to get the coating t for his running track. Of course, he also want’s to know some way to achieve the answer.

Input
First line of the input contains the string s — the coating that is present in the shop. Second line contains the string t — the coating Ayrat wants to obtain. Both strings are non-empty, consist of only small English letters and their length doesn’t exceed 2100.

Output
The first line should contain the minimum needed number of coatings n or -1 if it’s impossible to create the desired coating.

If the answer is not -1, then the following n lines should contain two integers xi and yi — numbers of ending blocks in the corresponding piece. If xi ≤ yi then this piece is used in the regular order, and if xi > yi piece is used in the reversed order. Print the pieces in the order they should be glued to get the string t.

Sample test(s)
input
abc
cbaabc
output
2
3 1
1 3
input
aaabrytaaa
ayrat
output
3
1 1
6 5
8 7
input
ami
no
output
-1
Note
In the first sample string “cbaabc” = “cba” + “abc”.

In the second sample: “ayrat” = “a” + “yr” + “at”.

题目链接:http://codeforces.com/contest/615/problem/C

题目大意:
输入字符串s和t,t要由s的一些片段组合成,s的片段可颠倒过来,求出最少的片段数以及每个片段的起始和终结字母的编号。

解题思路:暴力模拟。注意不能用string,否则会t,可是增加一个字符串表示反过来的s串。

代码如下:

#include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <string>
    using namespace std;
    int const maxn=2110;
    char a[maxn],b[maxn],c[maxn];
    int x[maxn],y[maxn];
    int main(void)
    {
        scanf("%s",a);
        scanf("%s",c);
        int n=strlen(a);
        for(int i=0;i<n;i++)
            b[i]=a[n-i-1];
        int m=strlen(c);
        int ans=0;
        for(int i=0;i<m;i++)
        {
            int ma=0,xx,yy;
            for(int j=0;j<n;j++)
            {
                if(c[i]==a[j])
                {
                    int k=i;
                    int h=j;
                    while(c[k]==a[h])
                    {
                        k++;
                        h++;
                        if(k==m || h==n)
                            break;
                    }
                    int l=k-i;
                    if(ma<l)
                    {
                        ma=l;
                        xx=j+1;
                        yy=j+l;         
                    }
                }   
            }

            for(int j=0;j<n;j++)
            {
                if(c[i]==b[j])
                {
                    int k=i;
                    int h=j;
                    while(c[k]==b[h])
                    {
                        k++;
                        h++;
                        if(k==m || h==n)
                            break;
                    }
                    int l=k-i;
                    if(ma<l)
                    {
                        ma=l;
                        xx=n-j;
                        yy=n-(j+l-1);           
                    }
                }   
            }
            if(ma)
            {
                x[ans]=xx;
                y[ans]=yy;
                ans++;
                i+=(ma-1);
            }
            else
            {
                ans=0;
                break;
            }
        }

        if(ans==0)
        {
            printf("-1\n");
            return 0;
        }
        printf("%d\n",ans );
        for(int i=0;i<ans;i++)
            printf("%d %d\n",x[i],y[i] );
    }

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值