题意:给出字符串s,以及m,计算距离字符串距离:dis(A,B)=∑|Ai?B|n?1?i|,在距离小于等于m的条件下找到最长的子串,并输出长度。
题解:官方题解就很好啊,从中心点向两边扩展,,如果合法,外层指针继续扩展,如果不合法,内层指针向外扩展。枚举一下中心向外延伸。
第一次是找到实质的中心点,依次扩展(存在中心点和邻接中心点的位置比较不到的问题),第二次是比较中心点和邻近中心点的位置。
#include <stdio.h> #include <algorithm> #include <math.h> #include <string.h> #include <vector> #include <queue> #include <stack> #include <iostream> #define pi acos(-1.0) #define INF 0x3f3f3f3f using namespace std; #define ll long long const int maxn=5010; int main() { //freopen("C:\\Users\\Administrator\\Desktop\\a.txt","r",stdin); //ios::sync_with_stdio(false); //freopen("C:\\Users\\Administrator\\Desktop\\b.txt","w",stdout); int T,m,ans; char s[maxn]; scanf("%d",&T); while(T--) { scanf("%d%s",&m,s); ans=0; int n=strlen(s); for(int i=0;i<n;i++) { int sum=0; for(int l=i,r=i,pr=i,pl=i;l>=0&&r<n;l--,r++) { sum+=abs(s[r]-s[l]); while(pr<n&&l>=0&&sum>m) sum-=abs(s[pr++]-s[pl--]); ans=max(ans,r-pr+(pr!=i)); } } for(int i=1;i<n;i++) { int sum=0; for(int l=i-1,r=i,pr=i,pl=i-1;l>=0&&r<n;l--,r++) { sum+=abs(s[r]-s[l]); while(pr<n&&l>=0&&sum>m) sum-=abs(s[pr++]-s[pl--]); ans=max(ans,r-pr+1); } } printf("%d\n",ans); } return 0; }
时间: 2024-10-01 14:12:37