Codeforces Global Round 4 Problem-E. Archaeology
E. Archaeology: http://codeforces.com/contest/1178/problem/E
题意:
一个只有a b c三种字符的字符串,问能否通过删除母串中一部分字符得到一个回文的字串?
分析:
因为只存在三种字符,且相邻两个字符不同,所以 s[l], s[l+1] 和 s[r], s[r-1]中一定存在相同的一对,然后左右同时枚举就可以了。注意:枚举到最后 l 和 r 中间有两个或一个字符,任意输出一个即可。
code:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+7;
char s[N]; // 母串
char ans[N]; // 子串
int main()
{
while(scanf("%s", s) != EOF)
{
memset(ans, 0, sizeof(ans));
int cnt = 0;
int len = strlen(s);
int i = 0, j = strlen(s) - 1;
while(j - i > 2 && len/2 > cnt)
{
if(s[i] == s[j]) // 第一种情况
{
ans[cnt] = s[i];
cnt++;
i++;
j--;
}
else if(s[i+1] == s[j]) // 第二种情况
{
ans[cnt] = s[i+1];
cnt++;
i += 2;
j--;
}
else if(s[i] == s[j-1]) // 第三种情况
{
ans[cnt] = s[i];
cnt ++;
i++;
j -= 2;
}
else if(s[i+1] == s[j-1]) // 第四种情况
{
ans[cnt] = s[i+1];
cnt ++;
i += 2;
j -= 2;
}
}
ans[cnt] = '\0';
printf("%s", ans);
printf("%c", s[i]);
reverse(ans, ans+cnt);
printf("%s\n", ans);
}
return 0;
}