CF335B


 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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM