zoukankan      html  css  js  c++  java
  • 【BZOJ-3725】Matryca 乱搞

    3725: PA2014 Final Matryca

    Time Limit: 5 Sec  Memory Limit: 128 MB
    Submit: 160  Solved: 96
    [Submit][Status][Discuss]

    Description

    有一堵长度为n的墙需要刷漆,你有一把长度为k的刷子。墙和刷子都被均匀划分成单位长度的小格,刷子的每一格中都沾有某种颜色(纯色)的漆。你需要用这把刷子在墙上每一个可能的位置(只要刷子不超出墙,且对准格子;共有n-k+1个位置)都刷一遍。如果墙上的某一格被不同颜色的漆刷过,那么它会呈现混合色。

    现在墙上某些格子需要刷成给定的颜色。求出能够完成任务的最短的刷子长度k。

    Input

    输入为一个长度为n(1<=n<=1000000)的字符串,由大写字母和星号组成。大写字母表示某种纯色,星号表示此位置颜色不作要求。

    Output

    输出最小的k。

    Sample Input

    A*B*B*A

    Sample Output

    6

    HINT

    解释:

    刷子的颜色为ABBBBA。

    Source

    鸣谢Jcvb

    Solution

    脑洞题,没什么好说的

    答案是 len-mindis+1

    len为字符串长度,mindis为相邻非*不同颜色的最短距离

    不妨这样考虑:

    假如,所以有颜色都必须是纯色,且两两不同,那么显然刷子为n,那么假如不同色的相邻最近为2,那么显然刷子刷子为n-2+1

    同理.....

    Code

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    #define MAXN 1000010
    char s[MAXN],A;
    int l,n,a,dis;
    int main()
    {
        scanf("%s",s+1); n=strlen(s+1);
        A='&'; dis=n;
        for (int i=1; i<=n; i++)
            if (s[i]!='*')
                {
                    if (A=='&') A=s[i],a=i;
                    else
                        if (A!=s[i])
                            {
                                dis=min(dis,i-a);
                                a=i,A=s[i];
                            }
                        else a=i;
                }
        printf("%d
    ",n-dis+1);
        return 0;
    }
  • 相关阅读:
    JS document.execCommand实现复制功能(带你出坑)
    jquery动态添加删除一行数据示例
    SpringBoot SpEL表达式注入漏洞-分析与复现
    Fastjson 1.2.22-24 反序列化漏洞分析
    udf提权原理详解
    ZZCMS v8.2 前台Insert注入+任意文件删除
    安恒杯 3月线上个人赛WriteUp
    SQLI LABS Stacked Part(38-53) WriteUp
    【转】Ubuntu16.04安装docker
    安装部署k8s-版本-1.13
  • 原文地址:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5668150.html
Copyright © 2011-2022 走看看