首页 > 代码库 > HDU 6103 Kirinriki(尺取法)

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(尺取法)