博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 6103 Kirinriki 枚举长度 尺取法
阅读量:7027 次
发布时间:2019-06-28

本文共 1469 字,大约阅读时间需要 4 分钟。

  题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6103

  题目描述: 定义两个相同长度的字符串的值为首尾开始字符串的ASCII相减, 求一个字符串中任取两个相同长度的不重叠的值不超过m的最大长度

  解题思路: 求连续区间不超过某一个上限或者不低于某个下限的应该用尺取法 ,复杂度为O(n),  本题n是5000所以O(n^2)可行, 枚举前缀和后缀(通过枚举前缀, 再将字符串翻转枚举前缀进行), 再进行尺取 

  代码:  代码中有注释

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1using namespace std;const int maxn = 21000;char str[maxn];int m,len;int solve() { int ans = 0;// cout << len << endl; for( int i = len; i >= 1; i-- ) { // 枚举每一个前缀// cout << "--- " << endl; int cnt = i/2-1; int d = 0,t = 0,p = 0; for( int j = 0 ; j <= cnt; j++ ) { d += abs( str[1+j]-str[i-j] ); // 加上权值 if( d > m ) { d -= abs( str[1+p]-str[i-p] ); // 将最前面的剪掉, 将最后面剪掉, 这样下一次循环还会加的是最后面 d -= abs( str[1+j]-str[i-j] ); p++; // 记录第一个字符串最前面的指针 t--; // 记录单个字符串的长度 j--; // 记录第一个字符串最后面的指针 } else { t++; // d <= m 就是说还可以向后再加一个字符串长度可以加一 ans=max(ans,t); } } } return ans;}int main() { int T; scanf( "%d", &T ); while( T-- ){ int ans = 0; scanf( "%d%s", &m, str+1 ); len = (int)strlen(str+1); ans = max( ans, solve() ); reverse( str+1, str+len+1 ); // 后缀和 ans = max( ans, solve() );// reverse( str+1, str+len+1 ); printf("%d\n",ans); } return 0;}
View Code

  思考: 以前看过尺取法, 忘了......以后记住求连续区间不超过某一个上限或者不低于某个下限的长度应该用尺取法 

转载于:https://www.cnblogs.com/FriskyPuppy/p/7344246.html

你可能感兴趣的文章
css伪元素实现tootip提示框
查看>>
Python基础知识随手记
查看>>
bzoj 1191 [HNOI2006]超级英雄Hero——二分图匹配
查看>>
关于xshell无法连接到centos的问题
查看>>
模块模式和单例模式的详解
查看>>
AMD和Intel的cpu架构的区别
查看>>
关于函数指针的总结
查看>>
whistle.js连接ios手机中https步骤
查看>>
TCP/IP 协议栈 ------ ICMP
查看>>
apache伪静态设置
查看>>
采用PHP函数uniqid生成一个唯一的ID
查看>>
Centos7安装32位库用来安装32位软件程序
查看>>
【HMOI】小C的填数游戏 DP+线段树维护
查看>>
java中23种设计模式之6-适配器模式(adapter pattern)
查看>>
Easy C 编程 in Linux
查看>>
SQL Server 事务语法
查看>>
poj3761(反序表)
查看>>
x86寄存器总结
查看>>
jquery easyui ajax data属性传值方式
查看>>
Elasticsearch分布式机制探究
查看>>