1 /*CF335B 2 这个题目的n达到50000,但是串只是有小写字母组成,所以如果字符串的长度大于2600,那么 3 肯定存在,所开始输入就判断如果长度大于2600,那么直接找当个字母输出100个 4 否则执行LCS模块,然后判断所得最长公共是否大于100,如果小于100,那么直接输出最长公共 5 否则从两头分别取50个输出*/ 6 #include<stdio.h> 7 #include<string.h> 8 int dp[2600][2600],dir[2600][2600]; 9 char a[50005],b[2605],c[2605]; 10 void LCS(int n,int m) 11 { 12 int i,j; 13 memset(dp,0,sizeof(dp)); 14 memset(dir,0,sizeof(dir)); 15 for(i=1;i<=n;i++) 16 for(j=1;j<=m;j++) 17 { 18 if(a[i-1]==b[j-1]) 19 { 20 dp[i][j]=dp[i-1][j-1]+1; 21 dir[i][j]=1; 22 } 23 else if(dp[i-1][j]>dp[i][j-1]) 24 { 25 dp[i][j]=dp[i-1][j]; 26 dir[i][j]=0; 27 } 28 else 29 { 30 dp[i][j]=dp[i][j-1]; 31 dir[i][j]=2; 32 } 33 } 34 } 35 int cont=0; 36 void print(int n,int m) 37 { 38 if(n==0 || m==0) return; 39 if(dir[n][m]==1) 40 { 41 print(n-1,m-1); 42 c[cont++]=a[n-1]; 43 } 44 else if(dir[n][m]==0) print(n-1,m); 45 else print(n,m-1); 46 } 47 int main() 48 { 49 int j,n; 50 int hash[250],flag=0,i=0; 51 char s; 52 memset(hash,0,sizeof(hash)); 53 gets(a); 54 n=strlen(a); 55 for(i=0;i<n;i++) 56 { 57 hash[a[i]]++; 58 } 59 for(i=0;i<26;i++) 60 { 61 if(hash['a'+i]>=100) { s='a'+i; flag=1; break;} 62 } 63 if(flag) 64 { 65 for(i=1;i<=100;i++) 66 printf("%c",s); 67 printf("\n"); 68 } 69 else 70 { 71 for(i=0,j=n-1;i<n;i++,j--) 72 b[j]=a[i]; 73 cont=0; 74 memset(c,0,sizeof(c)); 75 LCS(n,n); 76 print(n,n); 77 int num=strlen(c); 78 //printf("%d\n",num); 79 char m1[51],m2[51]; 80 if(num<=100) printf("%s\n",c); 81 else 82 { 83 memset(m1,0,sizeof(m1)); 84 memset(m2,0,sizeof(m2)); 85 for(i=0;i<50;i++) 86 m1[i]=c[i]; 87 for(i=num-1,j=49;i>=num-50;i--,j--) 88 m2[j]=c[i]; 89 //int num1=strlen(m1); 90 //int num2=strlen(m2); 91 printf("%s%s\n",m1,m2); 92 } 93 94 } 95 return 0; 96 }