zoukankan      html  css  js  c++  java
  • 【枚举】【尺取法】hdu6103 Kirinriki

    两个等长字符串A,B的距离被定义为

    给你一个字符串,问你对于所有长度相等的不相交子串对,其距离不超过m的前提下,最长的长度是多少。

    枚举对称轴,两侧先贪心地扩展到最长,超过m之后,再缩短靠近对称轴的端点,如此反复进行,每次更新答案的时候,都用的是当前“近对称轴端点”固定时的最长值。

    复杂度O(n^2)。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int Abs(int x){
    	return x<0 ? (-x) : x;
    }
    int T,m,n;
    char a[5005];
    int main(){
    	scanf("%d",&T);
    	for(;T;--T){
    		int ans=0;
    		scanf("%d%s",&m,a+1);
    		n=strlen(a+1);
    		for(int i=1;i<n;++i){
    			if(i==6){
    				i=6;
    			}
    			int sum=0;
    			int p1=i,p2=i+1,q1=i,q2=i+1;
    			while(p1>=1 && p2<=n){
    				while(sum<=m && p1>=1 && p2<=n){
    					sum+=Abs(a[p1]-a[p2]);
    					if(sum<=m){
    						ans=max(ans,q1-p1+1);
    					}
    					--p1;
    					++p2;
    				}
    				while(sum>m){
    					sum-=Abs(a[q1]-a[q2]);
    					--q1;
    					++q2;
    					if(sum<=m){
    						ans=max(ans,q1-p1);
    					}
    				}
    			}
    		}
    		for(int i=2;i<n;++i){
    			int sum=0;
    			int p1=i-1,p2=i+1,q1=i-1,q2=i+1;
    			while(p1>=1 && p2<=n){
    				while(sum<=m && p1>=1 && p2<=n){
    					sum+=Abs(a[p1]-a[p2]);
    					if(sum<=m){
    						ans=max(ans,q1-p1+1);
    					}
    					--p1;
    					++p2;
    				}
    				while(sum>m){
    					sum-=Abs(a[q1]-a[q2]);
    					--q1;
    					++q2;
    					if(sum<=m){
    						ans=max(ans,q1-p1);
    					}
    				}
    			}
    		}
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
  • 相关阅读:
    SpringMVC视图解析器
    FreeMarker介绍
    一篇很全面的freemarker教程
    request,session,application
    nav布局 在线演示 DIVCSS5
    opacity
    java 某字符串在另一字符串中是否存在
    bochs 使用讲解
    使用VS2015搭建Lua开发环境
    Zip文件格式
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/7376715.html
Copyright © 2011-2022 走看看