2017 Multi-University Training Contest

来源:互联网 发布:sql中exists的用法 编辑:程序博客网 时间:2024/06/06 14:07

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


题意:

  给出一个字符串,在里面截取两段长度相等且不重叠的字符串,使得两个字符串的距离之和不大于mdisA,B=i=0n1|AiBn1i|

思路:

  在总字符串中依次挑选长度为2~ len的子串,在满足距离和summ的前提下,从两边往里缩,正反各进行一次。

代码:

#include<bits/stdc++.h>using namespace std;const int MAX = 5e3 + 10;char s[MAX];int len,m,ans;void solve(){    int l,n,sum;    for(int i = 2;i <= len;i++){        int flag = i / 2;        l = n = sum = 0;        for(int j = 0;j < flag;j++){            sum += abs(s[j] - s[i - j - 1]);            if(sum <= m){                n++;                ans = max(ans,n);            }else{                sum -= abs(s[l] - s[i - l - 1]);                sum -= abs(s[j] - s[i - j - 1]);                n--;                j--;                l++;            }        }    }}int main(){    int T;    scanf("%d",&T);    while(T--){        scanf("%d %s",&m,s);        len = strlen(s);        ans = 0;        solve();        reverse(s,s + len);        solve();        printf("%d\n",ans);    }    return 0;}