HDU 6103 枚举 +尺取
来源:互联网 发布:上海医保报销软件 编辑:程序博客网 时间:2024/04/30 07:36
枚举 +尺取
题意:
给出一个字符串,问两个不相交的字串对称相减的绝对值和小于等于 m的最长长度。
思路:
如果存在两个不相交的字串,那么必然两个字串之间存在对称轴,分为两种:
1. 子串之间有奇数个其它字符,那么枚举其中的字符。2. 子串之间有偶数个其它字符,那么枚举其中的空格。
对称轴确定之后,对对称的串计算出其对称相减的和保存在数组中,那么问题转化为,在一个数组中找出和小雨等于m的最长连续字串,尺取法的经典应用。
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>using namespace std;const int maxn = 5005;int m,ans,pos;int a[maxn];char s[maxn];int Find(int n){ int sum = 0,ans = 0,cnt = 0,t = 0; while(1) { while(cnt < n && sum + a[cnt] <= m) { sum += a[cnt++]; ans = max(ans,cnt - t); } sum -= a[t++]; if(t >= n) break; } return ans;}int main(int argc, char const *argv[]){ // freopen("in.txt","r",stdin); int tt; scanf("%d",&tt); while(tt--) { scanf("%d",&m); scanf("%s",s+1); int len = strlen(s+1); ans = 0; for(int i = 1;i <= len; i++) { int pos = 0; for(int j = 1;j+i <= len && i-j > 0; j++) { a[pos++] = abs(s[j+i] - s[i-j]); } ans = max(ans,Find(pos)); } for(int i = 1;i <= len-1; i++) { pos = 0; for(int j = 0;j+i+1 <= len && i-j > 0; j++) { a[pos++] = abs(s[j+i+1] - s[i-j]); } ans = max(ans,Find(pos)); } printf("%d\n",ans); } return 0;}
永不言弃!!!
阅读全文
0 0
- HDU 6103 枚举 +尺取
- hdu 6103 Kirinriki 枚举+尺取
- HDU 6103 Kirinriki 枚举中间点(思维)+ 尺取
- hdu 6103 (尺取)
- 【HDU 6103 Kirinriki】 & 尺取
- hdu 6103 Kirinriki 【尺取】
- hdu 6103 Kirinriki 尺取
- 【尺取】hdu 6103 Kirinriki
- HDU 6103 Kirinriki(尺取)
- HDU 6103 Kirinriki(尺取)
- HDU 6103 Kirinriki(思维尺取)
- HDU 4007【尺取】
- hdu 6119(尺取)
- hdu 6103 暴力枚举+贪心
- hdu 5672 String(尺取)
- hdu 5289 Assignment(尺取)
- HDU 5289 RMQ+尺取
- HDU 5328 类似尺取
- 九九乘法表
- eclipse 查看类、方法被调用情况
- hdu6097—Mindis(计算几何)
- android修改状态栏的颜色
- C# 时间与时间戳的互相转化
- HDU 6103 枚举 +尺取
- Mybatis映射器的内部组成
- Eclipse使用之将Git项目转为Maven项目(全图解)
- Largest prime factor
- 如何在 Linux 系统下检测硬盘上的坏道和坏块
- 2017-8-11 db file sequential read占用很大可能存在的问题
- String,StringBuilder,StringBufferj简单区别
- Android monitor连接不上手机或模拟器
- caffe--源码学习网站