/*FZU 1989
题目大意:给定字符串,要求输出没有‘AC’的最长子串。
难点:连续“AC”串,处理为“CA”串
*/
#include<stdio.h>
#include<string.h>
char s[10050] = {0}, n_s[10050] = {0};
int sum[10050] = {0},c[10050] = {0},a[10050] = {0};
int main()
{
#ifdef LOCAL
freopen("D:\\emm\\in.txt","r",stdin);
#endif
int t,n = 1;
scanf("%d",&t);
while(t--){
int len,j = 0,i;
scanf("%s",s);
len = strlen(s); j = 0;
for(i = 0; i < len; i++){ //将不影响答案的字符塞入新字符串
if(s[i] != 'A'){
n_s[j++] = s[i];
}
else{
int cnt = 0,suma,sumc;
while(s[i] == 'A'){ //压缩连续AC子串
suma = sumc = 0;
while(s[i] == 'A'){
suma++;
i++;
}
while(s[i] == 'C'){
sumc++;
i++;
}
sum[++cnt] = suma;
sum[++cnt] = sumc;
}
int k;
for(k = 2; k <= cnt; k += 2) c[k] = c[k-2] + sum[k]; //计算C前缀和
a[cnt + 1] = 0; //下面会越界获得上一次的结果,所以要初始化
for(k = cnt - 1; k > 0; k -= 2) a[k] = a[k+2] +sum[k]; //计算A后缀和
int slen = 0, alen = 0, clen = 0,l;
for(l = 0; l <= cnt; l += 2){ //找出最长CA串
if(c[l] + a[l + 1] > slen){
slen = c[l] + a[l + 1];
alen = a[l + 1];
clen = c[l];
}
}
for(l = 0; l < clen; l++){
n_s[j++] = 'C';
}
for(l = 0; l < alen; l++){
n_s[j++] = 'A';
}
n_s[j++] = s[i];
}
}
n_s[j] = 0;
printf("Case %d: ", n++);
puts(n_s);
}
return 0;
}
基本上是看着别人题解写的。。。
补题 FZU 1989
最新推荐文章于 2020-11-23 14:10:42 发布