hdu6103 尺取 雙指標 2017多校第六場1008
阿新 • • 發佈:2019-01-02
題意
定義兩個字串的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;
}