成长轨迹45 【ACM算法之路 百炼poj.grids.cn】【字符串处理】【2797:最短前缀】
http://poj.grids.cn/practice/2797
【wa代码】
1 #include <stdio.h>
2 #include <string.h>
3 #include <ctype.h>
4 #include <cmath>
5
6 char ori[10050][22],pre[10050][22];
7
8 int main()
9 {
10 int n;
11 for(int i=0;i<10050;i++)
12 {
13 memset(ori[i],0,sizeof(ori[i]));
14 memset(pre[i],0,sizeof(pre[i]));
15 }
16 for(n=0;scanf("%s",ori[n])!=EOF;n++);
17
18 for(int i=0;i<n;i++)
19 {
20 int len=strlen(ori[i]);
21 for(int j=0;j<len;j++)
22 {
23 bool ok=true;
24 for(int k=i+1;k<n;k++)
25 if(strcmp(pre[i],pre[k])==0)//如果子串相同
26 {
27 ok=false;
28 if(strcmp(pre[k],ori[k])!=0)//如果k的子串不是它的全串
29 pre[k][j]=ori[k][j];
30 }
31 if(ok)
32 break;
33 pre[i][j]=ori[i][j];
34 }
35 }
36 for(int i=0;i<n;i++)
37 {
38 printf("%s %s\n",ori[i],pre[i]);
39 }
40
41 return 0;}
【ac代码】
1 #include <stdio.h>
2 #include <string.h>
3 #include <ctype.h>
4 #include <cmath>
5
6 char ori[10050][22],pre[10050][22];
7
8 int main()
9 {
10 int n;
11 for(int i=0;i<10050;i++)
12 {
13 memset(ori[i],0,sizeof(ori[i]));
14 memset(pre[i],0,sizeof(pre[i]));
15 }
16 for(n=0;scanf("%s",ori[n])!=EOF;n++);
17
18 for(int i=0;i<n;i++)
19 {
20 int len=strlen(ori[i]);
21 /*
22 【j==len就跳出的话,可能后面有跟它相同子串的还没有改,
23 所以必须只能在ok==true时跳出】
24 */
25 for(int j=0;;j++)
26 {
27 bool ok=true;
28 for(int k=i+1;k<n;k++)
29 if(strcmp(pre[i],pre[k])==0)//如果子串相同
30 {
31 ok=false;
32 if(strcmp(pre[k],ori[k])!=0)//如果k的子串不是它的全串
33 pre[k][j]=ori[k][j];
34 }
35 if(ok)
36 break;
37 if(strcmp(pre[i],ori[i])!=0)
38 pre[i][j]=ori[i][j];
39 }
40 }
41 for(int i=0;i<n;i++)
42 {
43 printf("%s %s\n",ori[i],pre[i]);
44 }
45
46 return 0;}
【标程】
1 #include <stdio.h>
2 #include <string>
3 #include <string.h>
4 #include <vector>
5 #include <list>
6 #include <math.h>
7 #include <algorithm>
8
9 using namespace std;
10
11 int main()
12 {
13 char dic[1001][21], subStr[21],tmp[21];
14
15 int i, j, p, k;
16
17 memset( dic , 0 , sizeof(char)*1001*21 );
18 memset( subStr , 0 , sizeof(char)*21 );
19 memset( tmp , 0 , sizeof(char)*21 );
20
21 k = 0 ;
22 while( EOF != scanf("%s",dic[k]) ) k++;
23
24 for( i = 0 ; i < k ; i++ )
25 {
26 for( j = 1 ; j <= strlen(dic[i]) ; j++ )
27 {
28 strncpy( subStr , dic[i] , j );
29 for( p = 0 ; p < k ; p++ )
30 {
31 if( p != i )
32 {
33 strncpy ( tmp , dic[p] , j );
34 if( strcmp(tmp,subStr) == 0 ) break ;
35 }
36 }
37 if( p < k )continue;
38 if( p == k )break;
39 }
40 printf("%s %s\n",dic[i],subStr);
41 memset( subStr , 0 , sizeof(char)*21 );
42 memset( tmp , 0 , sizeof(char)*21 );
43 }
44
45 return 1;
46 }