http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=970
通过对每一个字符串,每一个位置进行枚举三个操作,然后二分查找操作后的字符串是否存在,dp记录。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define N 25000 5 using namespace std; 6 7 char g[N][30]; 8 char s[30]; 9 int dp[N*10]; 10 11 void change(char *g,char *s,int pos,char ch) 12 { 13 int k=strlen(g); 14 for(int i=0; i<k; i++) 15 { 16 s[i]=g[i]; 17 } 18 s[pos]=ch; 19 s[k]=‘\0‘; 20 } 21 22 void add(char *g,char *s,int pos,char ch) 23 { 24 int k=strlen(g); 25 for(int i=0; i<pos; i++) 26 { 27 s[i]=g[i]; 28 } 29 s[pos]=ch; 30 for(int j=pos; j<k; j++) 31 { 32 s[j+1]=g[j]; 33 } 34 s[k+1]=‘\0‘; 35 } 36 37 void del(char *g,char *s,int pos) 38 { 39 int k=strlen(g); 40 for(int i=0; i<pos; i++) 41 { 42 s[i]=g[i]; 43 } 44 for(int j=pos+1; j<k; j++) 45 { 46 s[j-1]=g[j]; 47 } 48 s[k-1]=‘\0‘; 49 } 50 51 52 void Get_change(char *g,char *s,char ch,int pos,int f) 53 { 54 if(f==1) change(g,s,pos,ch); 55 else if(f==2) add(g,s,pos,ch); 56 else if(f==3) del(g,s,pos); 57 } 58 59 int bs(char *s,int r) 60 { 61 r--; 62 int l=0; 63 int mid; 64 while(l<=r) 65 { 66 mid=(l+r)>>1; 67 if(strcmp(g[mid],s)==0) 68 { 69 return mid; 70 } 71 else if(strcmp(g[mid],s)<0) 72 { 73 l=mid+1; 74 } 75 else 76 r=mid-1; 77 } 78 return -1; 79 } 80 int main() 81 { 82 //freopen("1.txt","r",stdin); 83 //freopen("2.txt","w",stdout); 84 int cnt=0; 85 while(gets(g[cnt])) 86 { 87 cnt++; 88 } 89 int ans=0; 90 for(int i=0; i<cnt; i++) 91 { 92 dp[i]=1; 93 for(int k=1; k<=3; k++) 94 { 95 for(int j=0; j<(int)strlen(g[i]); j++) 96 { 97 for(int c=0; c<26; c++) 98 { 99 Get_change(g[i],s,‘a‘+c,j,k); 100 if(strcmp(g[i],s)<0) break; 101 int x=bs(s,i); 102 if(x>=0) dp[i]=max(dp[i],dp[x]+1); 103 } 104 } 105 106 } 107 ans=max(ans,dp[i]); 108 } 109 printf("%d\n",ans); 110 return 0; 111 }
时间: 2024-11-25 06:45:04