您的位置:首页 > 大数据 > 人工智能

2017 Multi-University Training Contest - Team 6 1008 Kirinriki【思维题 + 尺取】

2017-08-11 16:18 519 查看
传送门

//题意: 在给定的一个串中找出两个不重叠且长度相等的两个子串, 并这连两个串的dis要小于所给的那个数.

dis为题目中的定义.

//思路:由于不确定性, 所以我们可以采取枚举的方法. 因为连个串的长度是相等的, 两个串往中心延展, 一定会形成一个对称轴. 所以我们就可以采取枚举对称轴的方法来做. 枚举每一个前缀,用尺取的方法取两个区间, 而我们可以发现每一个前缀它的对称轴都是靠左的, 那么有一些串我们就枚举不到. 所以我们反着在枚举一次, 即枚举每一个后缀. 这样就可以把每一种答案就枚举出来. 关键在于尺取的双指针的移动.

AC Code

const int maxn=5e3+5;
char a[maxn];
int m,res;
void cal(int n)
{
for(int i=2;i<=n;i++){
int p = i/2,l=0,cnt=0,sum=0;
for(int j=0;j<p;j++){
sum += abs(a[j] - a[i-1-j]);  // 从两边往里缩进
if(sum <= m) cnt++,res = max(res,cnt);
else{
sum -= abs(a[l] - a[i-l-1]);
sum -= abs(a[j] - a[i-j-1]);  //再把当前的再减一次,是因为此时j会移动
//然后又是原先的操作,所以此时保存的子串就是我们第二次算的子串.
//这里有点难理解,多打点东西出来就可以了.
l++; cnt--; j--;   //一直到满足条件在缩进
}
}
}
}

void solve()
{
scanf("%d",&m);
scanf("%s",a);
res = 0;
int len = strlen(a);
cal(len); reverse(a,a+len); cal(len);
printf("%d\n",res);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐