第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛(沈阳)正式赛-Problem E. Edward Gaming, the Champion

题目:

思路分析:

一个简单的字符串的单模匹配!kmp就行没必要上自动机

代码实现:

/*
*@Author:   GuoJinlong
*@Language: C++
*/
//#include <bits/stdc++.h>
/*
 *                                                     __----~~~~~~~~~~~------___
 *                                    .  .   ~~//====......          __--~ ~~
 *                    -.            \_|//     |||\\  ~~~~~~::::... /~
 *                 ___-==_       _-~o~  \/    |||  \\            _/~~-
 *         __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
 *     _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
 *   .~       .~       |   \\ -_    /  /-   /   ||      \   /
 *  /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
 *  |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
 *           '         ~-|      /|    |-~\~~       __--~~
 *                       |-~~-_/ |    |   ~\_   _-~            /\
 *                            /  \     \__   \/~                \__
 *                        _--~ _/ | .-~~____--~-/                  ~~==.
 *                       ((->/~   '.|||' -_|    ~~-/ ,              . _||
 *                                  -_     ~\      ~~---l__i__i__i--~~_/
 *                                  _-~-__   ~)  \--______________--~~
 *                                //.-~~~-~_--~- |-------~~~~~~~~
 *                                       //.-~~~--\
 *                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 *                               神兽保佑            永无BUG
 */

//#include<bits/stdc++.h>
using namespace std;
const int NN=100;
string A,B;
int Next[NN];
int ans;
void getnext()
{
    memset(Next,0,sizeof(Next));
    Next[0]=-1;
    Next[1]=0;//长度为1的字符串,设定next为0
    int i=1,j;
    int len=0;
    while(i<B.length())
    {
        if(len==-1||B[i]==B[len])
        {
            len++;
            i++;
            Next[i]=len;
        }
        else len=Next[len];
    }
//    for(int i=0; i<B.length(); i++)
//        printf("next[%d]:%d ",i,Next[i]);
//    cout<<endl;
}
void KMP()
{
    getnext();
    int i=0,j=0;
    bool cnt=0;
    while(i<A.length())
    {
        //cout<<i<<" "<<j<<endl;
        if(j==-1||A[i]==B[j])
        {
            i++,j++;
            if(j>=B.length())
            {
                cnt=1;
                int k1=i-B.length();
//                cout<<"区间"<<k1<<" "<<i-1<<endl;
                ans++;
                j=0;
            }
        }
        else j=Next[j];
    }
//    if(!cnt)cout<<"NO"<<endl;
    cout<<ans;
}
int main()
{
//    cin>>A>>B;
    cin>>A;
    B="edgnb";
    KMP();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_57006708/article/details/121454714