HDU 6103 Kirinriki(尺取法)

Posted 谦谦君子,陌上其华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 6103 Kirinriki(尺取法)相关的知识,希望对你有一定的参考价值。

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(尺取法)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 6103 Kirinriki

hdu6103[尺取法] 2017多校6

HDU 6103 Kirinriki (思维 双指针)

hdu 6103 Kirinriki

Kirinriki 2017多校

HDU 5328 Problem Killer(尺取法)