zoukankan      html  css  js  c++  java
  • Codeforces Round #187 (Div. 2) D

    这题思路不难, 比赛的时候没时间想了,唉。。。

    而且我在做的时候还错误的理解了题意,我以为是在【a,b】的子串中,判断最长的【c,d】。结果想了很久,想到脑子都快炸了,想出来后发现样例有问题,然后才发现我个2B题意又读错了。其实是在【a,b】中删除一些元素得到最大的 【c,d】,这样子就更好做了。

    解法: 首先可以知道的是,如果要在一个字符串s中删除一些元素的得到最多的连续的t串,那么我们可以采用贪心的策略,从头到尾扫一遍,用两个指针分别指向s和t,如果s[i]==t[j],这i++,j++,否则i++.

    有了这个性质之后,就可以知道一个a可能有多个b,也可能没有b,但是可以知道的是,这个里面是有循环的, 然后就是找出循环结,就可以了

    说的很是不清楚,还是看代码来的清晰把

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <algorithm>
    #include <math.h>
    #include <map>
    #include <queue>
    #include <sstream>
    #include <iostream>
    using namespace std;
    #define INF 0x3fffffff
    #define N 110
    
    char stra[110];
    char strb[110];
    int mark[110];
    int g[11000];
    
    // fuck! 看错题还想的这么开心
    
    
    int main()
    {
        //freopen("//home//chen//Desktop//ACM//in.text","r",stdin);
        //freopen("//home//chen//Desktop//ACM//out.text","w",stdout);
        int b,d;
        scanf("%d%d",&b,&d);
        scanf("%s",stra);
        scanf("%s",strb);
        int lena=strlen(stra);
        int lenb=strlen(strb);
        memset(mark,-1,sizeof(mark));
        mark[0] = 0;
        int pos=0;
        int key=0;
        int cnt=0; //多少个A产生一次循环
        int num=0; // 一个循环产生多少个B串
        for(int ii=1;ii<=1000;ii++)
        {
            int sum=0;
            for(int i=0;i < lena;i++)
            {
                if(stra[i] == strb[pos])
                {
                    pos++;
                    if(pos==lenb)
                    {
                        sum++;
                        pos = 0;
                    }
                }
            }
            g[ii] = sum;
            if(mark[pos]==-1)
                mark[pos]=ii;
            else
            {
                key = mark[pos];
                cnt = ii - key;
                for(int ti=key+1;ti<=ii;ti++)
                    num+=g[ti];
                break;
            }
        }
        int ans = 0;
        if(b <= key)
        {
            for(int i=1;i<=b;i++)
                ans+=g[i];
        }
        else
        {
            int tb=(b-key)/cnt;
            int tt=(b-key)-tb*cnt;
            for(int i =1 ;i<=key;i++)
                ans += g[i];
            ans += tb*num;
            for(int i=key+1;i<=key+tt;i++)
                ans+=g[i];
        }
        printf("%d\n",ans/d);
        return 0;
    }
  • 相关阅读:
    MySQL大数据分页调优实践
    CentOS 搭建L2TP
    CentOS 搭建SS5
    CentOS 搭建PPTP
    CentOS 防火墙 firewalld
    CentOS 初始化账号
    nginx升级与回退
    Python
    python
    linux
  • 原文地址:https://www.cnblogs.com/chenhuan001/p/3130798.html
Copyright © 2011-2022 走看看