zoukankan      html  css  js  c++  java
  • GHOJ 428 未出现的子串

    题目大意

      给定一个长度为(n)的数字序列(s)(1 leq n leq 100000)),满足(1 leq s_i leq q)(5 leq q leq 9))。求一个最短的子序列(s'),满足(s')(s)中没有出现。为了方便,请输出(s')的长度。

    题解

      当存在一个(i),满足(s_1 dots s_i)中数字(1 dots q)都出现过,那么肯定不存在长度(leq 1)(s')。当存在一个(j),满足(s_{i + 1} dots s_j)中数字(1 dots q)都出现过,那么肯定不存在长度(leq 2)(s')
      容易推广得对于序列(p),如果满足(p_0 = 1)(p_i < p_{i + 1})(p_m leq n),且(s_{p_i} dots s_{p_{i + 1} - 1})中数字(1 dots q)都出现过,则最大的(m)即为所求的(s')的长度。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    int n, q;
    bool b[15];
    int ans = 1;
    
    int main()
    {
    	scanf("%d%d", &n, &q);
    	int cnt = 0, tmp;
    	while (n--)
    	{
    		getchar();
    		tmp = getchar() - '0';
    		if (!b[tmp])
    		{
    			b[tmp] = true;
    			++cnt;
    			if (cnt == q) 
    			{
    				++ans;
    				cnt = 0;
    				memset(b, 0, sizeof b);
    			}
    		}
    	}
    	printf("%d", ans);
    	return 0;
    }
    
  • 相关阅读:
    常见的无损压缩算法
    多媒体基本概念
    电子商务
    Java正则表达式
    Java 注解
    java泛型
    Java的反射机制
    Java 动态代理
    函数调用约定_stdcall[转]
    要研究的东东啊
  • 原文地址:https://www.cnblogs.com/kcn999/p/11563134.html
Copyright © 2011-2022 走看看