1. 程式人生 > >hdu6103 尺取 雙指標 2017多校第六場1008

hdu6103 尺取 雙指標 2017多校第六場1008

題意
定義兩個字串的dis為兩者字典序之差,一個字串從前往後,另一個從後往前。現在給出一個m和一個字串,要求求出最長的給定字串的兩個子串滿足它們之間的dis小於等於m的長度。

題解
dis計算類似迴文串,我們可以列舉對稱中點,然後用尺取的思想用雙指標實現。列舉對稱中點時要注意有奇偶兩種情況。
具體可以看程式碼註釋

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxn = 5e3+5;
char str[maxn];
int len,m,ans;

//x為列舉子串開始左端點,y為右端點
void solve(int x,int y) { //r為向兩端擴充套件的長度,l為中點向兩端縮減的長度 int dis=0,l=0,r=0; while(x-r>=0 && y+r<len) { //向兩端擴充套件時dis滿足 if(dis+abs(str[x-r]-str[y+r])<=m) { dis += abs(str[x-r]-str[y+r]); r++; ans = max(ans,r-l); } else
//不滿足 { dis -= abs(str[x-l]-str[y+l]); //從中點縮減 l++; } } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&m); scanf("%s",str); len = strlen(str); ans = 0; for(int i=0;i<len;i++) { solve(i-1
,i+1); //為奇 solve(i,i+1); //為偶 } printf("%d\n",ans); } return 0; }