MemSQL start[c]up Round 2 - online version(DP)
只有小写字母 那>=2600的直接找单字母串长度大于等于100的就可以了
<2600 的dp找最长回文串
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 using namespace std; 8 #define N 50010 9 char s[N]; 10 char pa[2610]; 11 int dp[2610][2610][2],g,n,o[30]; 12 void dfs(int ss,int i,int j,int k) 13 { 14 if(ss==0) 15 return ; 16 if(i==j) 17 { 18 pa[g++] = s[i]; 19 return ; 20 } 21 if(i!=n-1&&j&&s[i]==s[j]&&dp[i][j][k]==dp[i+1][j-1][k]+2) 22 { 23 24 pa[g++] = s[i]; 25 dfs(dp[i+1][j-1][k],i+1,j-1,k); 26 return ; 27 } 28 if(i!=n-1&&dp[i][j][k]==dp[i+1][j][k]) 29 { 30 dfs(dp[i+1][j][k],i+1,j,k); 31 return ; 32 } 33 if(j&&dp[i][j][k]==dp[i][j-1][k]) 34 { 35 dfs(dp[i][j-1][k],i,j-1,k); 36 return ; 37 } 38 } 39 int main() 40 { 41 int i,j,d; 42 cin>>s; 43 int k = strlen(s); 44 n = k; 45 if(k>=2600) 46 { 47 for(i = 0; i < k ; i++) 48 o[s[i]-'a']++; 49 for(i = 0 ; i < 26 ; i++) 50 if(o[i]>=100) 51 { 52 d = i; 53 break; 54 } 55 for(i = 1 ; i <= 100 ; i++) 56 printf("%c",d+'a'); 57 puts(""); 58 } 59 else 60 { 61 for(i = 0 ; i < k ; i++) 62 { 63 dp[i][i][0] = 1; 64 } 65 for(i = k-1 ; i >= 0 ;i--) 66 for(j = i+1 ; j < k ; j++) 67 { 68 if(s[i]==s[j]) 69 { 70 dp[i][j][0] = dp[i+1][j-1][0]+2; 71 dp[i][j][1] = dp[i+1][j-1][1]+2; 72 } 73 dp[i][j][0] = max(dp[i][j][0],max(dp[i+1][j][0],dp[i][j-1][0])); 74 75 dp[i][j][1] = max(dp[i][j][1],max(dp[i+1][j][1],dp[i][j-1][1])); 76 } 77 } 78 if(dp[0][k-1][1]>=100) 79 { 80 dfs(dp[0][k-1][1],0,k-1,1); 81 for(i = 0 ; i < 50 ; i++) 82 printf("%c",pa[i]); 83 for(i = 50-1 ; i >= 0 ; i--) 84 printf("%c",pa[i]); 85 puts(""); 86 } 87 else 88 { 89 dfs(dp[0][k-1][0],0,k-1,0); 90 for(i = 0 ; i < g ; i++) 91 printf("%c",pa[i]); 92 if(dp[0][k-1][0]%2!=0) 93 g--; 94 for(i = g-1 ; i >= 0 ; i--) 95 printf("%c",pa[i]); 96 puts(""); 97 } 98 return 0; 99 }