hdu--1867--kmp<kmp,怪我太sb>

这题 做的时候 肯定自己短路了...

一开始 拿到手  思考了下 我就想 暴力做了...

我是想到kmp了  但我考虑错了 对于跳出循环那边 想错了 艹....

然后 就暴力 tle tle 。。。

然后 我去看了下 别人的解题报告 顿悟啊...

直接贴别人的AC代码吧 不想写了 心累啊

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 const int size = 100010;
 6 char str1[size];
 7 char str2[size];
 8 
 9 int solve( char* str1 , char* str2 , int& val )
10 {
11     int i , j , t , ans;
12     int len1 = strlen(str1);
13     int len2 = strlen(str2);
14     ans = size*size;
15     for( i = 0 ; i<len1 ; i++ )
16     {
17         t = i;
18         j = 0;
19         while( t<len1 && j<len2 && str1[t] == str2[j] )
20         {
21             t ++;
22             j ++;
23         }
24         if( t==len1 )
25         {
26             val = i;
27             ans = len2+i;
28             break;
29         }
30     }
31     return ans;
32 }
33 
34 void outPut( int val , int ans , char* str1 , char* str2 )
35 {
36     for( int i = 0 ; i<val ; i++ )
37     {
38         cout << str1[i];
39     }
40     cout << str2 << endl;
41 }
42 
43 int main()
44 {
45     cin.sync_with_stdio(false);
46     int i , j , t;
47     int val1 , ans1 , val2 , ans2 , ans , flag;
48     while( cin >> str1 >> str2 )
49     {    
50         val1 = val2 = -1;
51         ans1 = solve( str1 , str2 , val1 );
52         ans2 = solve( str2 , str1 , val2 );
53         ans = min( ans1 , ans2 );    
54         flag = strcmp(str1,str2);
55         if( ans == size*size )
56         {
57             if( flag<0 )
58             {
59                 cout << str1 << str2 << endl;
60             }
61             else
62             {
63                 cout << str2 << str1 << endl;
64             }
65         }
66         else
67         {
68             if( ans1 < ans2 )
69             {
70                 outPut( val1 , ans1 , str1 , str2 );
71             }
72             else if( ans1 > ans2 )
73             {
74                 outPut( val2 , ans2 , str2 , str1 );
75             }
76             else
77             {
78                 if( flag<0 )
79                 {
80                     outPut( val1 , ans1 , str1 , str2 );
81                 }
82                 else
83                 {
84                     outPut( val2 , ans2 , str2 , str1 );
85                 }
86             }
87         }
88     }
89     return 0;
90 }
View Code

暴力地 拿上来,...

 1 复制代码
 2 
 3 #include<iostream>
 4 #include<cstdio>
 5 #include<cstring>
 6 
 7 using namespace std;
 8 
 9 const int maxn=100010;
10 
11 int next[maxn];
12 char s1[maxn],s2[maxn];
13 
14 void getnext(char *t){
15     int len=strlen(t);
16     int i=0,j=-1;
17     next[0]=-1;
18     while(i<len){
19         if(j==-1 || t[i]==t[j]){
20             i++;j++;
21             next[i]=j;
22         }else
23             j=next[j];
24     }
25 }
26 
27 int KMP(char *s,char *t){
28     int len1=strlen(s),len2=strlen(t);
29     int i=0,j=0;
30     getnext(t);
31     while(i<len1 && j<len2){
32         if(j==-1 || s[i]==t[j]){
33             i++;j++;
34         }else
35             j=next[j];
36     }
37     if(i==len1)
38         return j;
39     return 0;
40 }
41 
42 int main(){
43 
44     //freopen("input.txt","r",stdin);
45 
46     while(~scanf("%s%s",s1,s2)){
47         int x=KMP(s1,s2);
48         int y=KMP(s2,s1);
49         if(x==y){
50             if(strcmp(s1,s2)<0)
51                 printf("%s%s\n",s1,s2+x);
52             else
53                 printf("%s%s\n",s2,s1+x);
54         }else if(x>y)
55             printf("%s%s\n",s1,s2+x);
56         else
57             printf("%s%s\n",s2,s1+y);
58     }
59     return 0;
60 }
View Code

还是 去洗个澡吧...

 

posted @ 2014-08-15 21:48  radical  阅读(128)  评论(0编辑  收藏  举报