Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1160 Accepted Submission(s): 448
题解:用manacher保存位置;然后再转义字符;
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
const int INF=0x3f3f3f3f;
#define mem(x,y) memset(x,y,sizeof(x))
typedef long long LL;
const int MAXN=200010;
char s[MAXN],a[MAXN<<1];
int ans,ps;
int p[MAXN<<1];
void manacher(){
int m=1,l=1,r=1;
ans=0;ps=0;
int len=strlen(a);
p[0]=p[1]=1;
for(int i=2;i<len;i++){
if(r>i)p[i]=min(p[m-(i-m)],r-i);
else p[i]=1;
while(a[i-p[i]]==a[i+p[i]])p[i]++;
if(p[i]+i>r)r=p[i]+i,m=i;
if(p[i]-1>ans)ans=p[i]-1,ps=i;
}
}
int main(){
char ch[2];
while(~scanf("%s%s",ch,s)){
int len=strlen(s);
a[0]=‘#‘;
for(int i=0;i<len;i++){
a[i*2+1]=s[i];
a[i*2+2]=‘#‘;
}
a[len*2+1]=‘#‘;a[len*2+2]=‘\0‘;
manacher();
//printf("%d\n",ans);
int l=(ps-ans+1)/2,r=l+ans-1;
if(ans==1){
puts("No solution!");continue;
}
printf("%d %d\n",l,r);
int t=ch[0]-‘a‘;
for(int i=l;i<=r;i++){
if(s[i]-‘a‘>=t)printf("%c",s[i]-t);
else printf("%c",s[i]-t+26);
}puts("");
}
return 0;
}
原文:http://www.cnblogs.com/handsomecui/p/4996084.html