HDU 1686

简介: View Code 1 //hdu2087 2 #include 3 #include 4 #include 5 using namespace std; 6 string str1,str2; 7 int next[1005]; 8 void ge...
View Code
 1 //hdu2087 
 2 #include <iostream>
 3 #include <string>
 4 #include <cstring>
 5 using namespace std;
 6 string str1,str2; 
 7 int next[1005];
 8 void get()
 9 {
10     int i = 0;
11     int j = -1;
12     memset(next,0,sizeof(next));
13     next[0] = -1;//不加的话会死循环,因为 j = next[j](j=0) 会赋一个垃圾数字 
14     while(i<str2.length())
15     {
16         if(j==-1||str2[i]==str2[j])
17         {
18             i++;
19             j++;
20             next[i] = j;
21         }
22         else
23             j = next[j];
24     }
25 }
26 int kmp()
27 {
28     int i = 0, j = 0;
29     int cnt = 0;
30     while(i<str1.length())
31     {
32         if(j==-1||str1[i]==str2[j])
33         {
34             i++;
35             j++;
36              if(j==str2.length())
37              {
38                 cnt++;
39                 j=0;
40              }
41         }
42         else
43             j = next[j];
44     }
45     return cnt;
46 }  
47 int main()
48 {
49     while(cin>>str1)
50     {
51         if(str1[0]=='#')
52             break;
53         cin>>str2;
54         get();
55         int cnt = kmp();
56         cout<<cnt<<endl;
57         str1.clear();
58         str2.clear();
59     }
60     return 0;
61 }

 

 1 //模式串在主串中出现次数
 2 //估计find会超时 
 3 //不论哪一个next函数均可AC 
 4 #include <iostream>
 5 #include <cstring>
 6 #include <string>
 7 using namespace std;
 8 string s1,s2;
 9 int next[10005];
10 void get()
11 {
12     int i = 0;
13     int j = -1;
14     memset(next,0,sizeof(next));
15     next[0] = -1;//不加的话会死循环,因为 j = next[j](j=0) 会赋一个垃圾数字 
16     while(i<s1.length())
17     {
18         if(j==-1||s1[i]==s1[j])
19         {
20             i++;
21             j++;
22            // if(s1[i]!=s1[j])
23                 next[i] = j;
24            // else
25                // next[i] = next[j];
26         }
27         else
28             j = next[j];
29     }
30 }
31 int kmp()
32 {
33     int i = 0, j = 0;
34     int cnt = 0;
35     while(i<s2.length())//(i<=(s2.length()-s1.length()))不行 
36     {
37         if(j==-1||s1[j]==s2[i])
38         {
39             i++;
40             j++;
41         }
42         else
43             j = next[j];
44         if(j==s1.length())
45         {
46             cnt++;
47             j = next[j];//此处改为j = 0就变成减花布条那一题啦 
48         }
49     }
50     return cnt;
51 }  
52 int main()
53 {
54     int i,j,k,T;
55     cin>>T;
56     while(T--)
57     {
58         s1.clear();
59         s2.clear();
60         cin>>s1;
61         cin>>s2;
62         get();
63         int cnt = kmp();
64         cout<<cnt<<endl;
65     }
66     return 0;
67 }
68         
69     
View Code
//超时,即便全为C风格也超时 
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
string s1,s2;
int next[10005];
void get()
{
    int i = 0;
    int j = -1;
    memset(next,0,sizeof(next));
    next[0] = -1;//不加的话会死循环,因为 j = next[j](j=0) 会赋一个垃圾数字 
    while(i<s1.length())
    {
        if(j==-1||s1[i]==s1[j])
        {
            i++;
            j++;
            if(s1[i]!=s1[j])
                next[i] = j;
            else
                next[i] = next[j];
        }
        else
            j = next[j];
    }
}
int kmp()
{
    int i = 0, j = 0;
    int cnt = 0;
    while(i<s2.length())//(i<=(s2.length()-s1.length()))不行 
    {
        if(j==-1||s1[j]==s2[i])
        {
            i++;
            j++;
            if(j==s1.length())
            {
                cnt++;
                i = i-j+1;
                j = 0;
            }
        }
        else
            j = next[j];
    }
    return cnt;
}  
int main()
{
    int i,j,k,T;
    cin>>T;
    while(T--)
    {
        s1.clear();
        s2.clear();
        cin>>s1;
        cin>>s2;
        get();
        int cnt = kmp();
        cout<<cnt<<endl;
    }
    return 0;
}
        
    

 

目录
相关文章
|
7月前
|
Java
hdu-2546-饭卡
hdu-2546-饭卡
32 0
HDU 2669 Romantic
题意:找出最小的非负整数X,使之满足式子X*a + Y*b = 1。
113 0
|
算法 Java 人工智能