码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 6103 Kirinriki(尺取法)

时间:2017-08-10 22:36:43      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:code   pair   ios   air   lan   names   strlen   cto   const   

http://acm.hdu.edu.cn/showproblem.php?pid=6103

题意:

给出一个字符串,在其中找两串互不重叠的子串,计算它们之间的dis值技术分享,要求dis值小于等于m,求能选的子串的最大长度。

 

思路:

由于这两个子串是互不重叠的,那么这两个子串之间的间隔可以是奇数也可以是偶数,针对这两种情况我们枚举中心点,然后尺取法处理,具体看代码就懂了。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<sstream>
 6 #include<vector>
 7 #include<stack>
 8 #include<queue>
 9 #include<cmath>
10 #include<map>
11 #include<set>
12 using namespace std;
13 typedef long long ll;
14 typedef pair<int,ll> pll;
15 const int INF = 0x3f3f3f3f;
16 const int maxn=5000+5;
17 
18 int n, m;
19 int cnt;
20 int ans;
21 char s[maxn];
22 int tmp[maxn];
23 
24 void check()
25 {
26     int l=0,r=0;
27     int dis=0;
28     while(r<cnt)
29     {
30         dis+=tmp[++r];
31         while(dis>m)   dis-=tmp[++l];
32         ans=max(ans,r-l);
33     }
34 }
35 
36 int main()
37 {
38     //freopen("in.txt","r",stdin);
39     int T;
40     scanf("%d",&T);
41     while(T--)
42     {
43         scanf("%d",&m);
44         scanf("%s",s+1);
45         n=strlen(s+1);
46 
47         ans=0;
48         for(int i=1;i<=n;i++)  //中间相隔奇数
49         {
50             int l=i-1,r=i+1;
51             cnt=0;
52             while(l>0 && r<=n)  {tmp[++cnt]=abs(s[l]-s[r]);l--;r++;}
53             check();
54         }
55 
56         for(int i=1;i<=n;i++) //中间相隔偶数
57         {
58             int l=i,r=i+1;
59             cnt=0;
60             while(l>0 && r<=n)  {tmp[++cnt]=abs(s[l]-s[r]);l--;r++;}
61             check();
62         }
63 
64         printf("%d\n",ans);
65     }
66     return 0;
67 }

 

HDU 6103 Kirinriki(尺取法)

标签:code   pair   ios   air   lan   names   strlen   cto   const   

原文地址:http://www.cnblogs.com/zyb993963526/p/7341303.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!