首先可以用fgets读取一行,用辅助字符数组保存字母和在原数组的序号
http://blog.chinaunix.net/uid-22566367-id-381994.html
http://blog.chinaunix.net/uid-21757287-id-327365.html
接下来有几种方法
1.依次遍历中心点,分为奇偶回文子串依次分析
#include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <stack> #include <cctype> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) #define pf printf #define sf scanf #define spf sprintf #define debug printf("! ") #define INF 10000 #define MAXN 5010 #define MAX(a,b) a>b?a:b #define blank pf(" ") #define LL long long char buf[MAXN],s[MAXN],p[MAXN]; int main() { int n,m=0,i,j,mx=0,x,y; fgets(buf,MAXN,stdin); n=strlen(buf); for(i=0;i<n;i++) { if(isalpha(buf[i])) { p[m] = i; s[m++]=toupper(buf[i]); } } for(i=0;i<m;i++) pf("%c",s[i]); blank; for(i=0;i<m;i++) { for(j=0;i-j>=0 && i+j<m;j++) { if(s[i-j]!=s[i+j]) break; if(2*j+1>mx) { mx = 2*j+1; x=p[i-j]; y=p[i+j]; } } for(j=0;i-j>=0 && i+j+1<m;j++) { if(s[i+j+1]!=s[i-j]) break; if(2*j+2>mx) { mx = 2*j+2; x=p[i-j]; y=p[i+j+1]; } } } //pf("tt%d %d %d ",x,y,mx); for(i=x;i<=y;i++) pf("%c",buf[i]); blank; } /* Confuciuss say:Madam,I'm Adam. */
2.Manacher算法
http://blog.csdn.net/yzl_rex/article/details/7908259
http://www.cnblogs.com/biyeymyhjob/archive/2012/10/04/2711527.html
#include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <stack> #include <cctype> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) #define pf printf #define sf scanf #define spf sprintf #define debug printf("! ") #define INF 10000 #define MAXN 5010 #define MAX(a,b) a>b?a:b #define blank pf(" ") #define LL long long char buf[MAXN],s[2*MAXN],p[MAXN],tmp[MAXN],q[2*MAXN],ans=1; int main() { int n,m=2,i,j,mx=0,x,y,maxid=0,id,mm; mem(q,0); fgets(buf,MAXN,stdin); n=strlen(buf); s[0] = '@'; s[1] = '#'; for(i=0;i<n;i++) { if(isalpha(buf[i])) { q[m] = i; s[m++]=toupper(buf[i]); s[m++] = '#'; } } s[m]=='