标签:
b babd a abcd
0 2 aza No solution!
题意:给出一个串和一个字符ch,这个串是原串把a替换成ch,b换成ch+1,c换成
ch+2..得来的,然后求原串的最长回文子序列.
manachar以后遍历一遍数组就好了,注意+26以后取模.
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
#define maxn 211111
int len[maxn<<1];
char s[maxn<<1];
char a[maxn];
char change;
int f (int x) {
return (x-1)>>1;
}
int manachar (char *p) {
int n = strlen (p), l = 0;
s[l++] = '@';
s[l++] = '#';
for (int i = 0; i < n; i++) {
s[l++] = p[i];
s[l++] = '#';
}
s[l] = 0;
int Max = 0, pos = 0, ans = 0;
for (int i = 1; i < l; i++) {
if (Max > i) {
len[i] = min (len[2*pos-i], Max-i);
}
else
len[i] = 1;
while (s[i+len[i]] == s[i-len[i]])
len[i]++;
ans = max (ans, len[i]);
if (len[i]+i > Max) {
Max = len[i]+i;
pos = i;
}
}
ans--;
if (ans == 1) {
printf ("No solution!\n");
return 0;
}
for (int i = 1; i < l; i++) {
if (len[i]-1 == ans) {
printf ("%d %d\n", f(i-len[i]+2), f(i+len[i]-2));
for (int j = i-len[i]+1; j <= i+len[i]-1; j++) if (s[j] != '#') {
printf ("%c", 'a'+(s[j]-change+26)%26);
}
puts ("");
return 0;
}
}
return 0;
}
int main () {
//freopen ("in.txt", "r", stdin);
while (scanf ("%s%s", s, a) == 2) {
change = s[0];
manachar (a);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/morejarphone/article/details/51366170