KMP + 贪心

寻找子串

http://www.nowcoder.com/questionTerminal/266fa434c2b641fc8c5f430de127c64f

#include <iostream>
#include <string.h>
using namespace std;

int m;
const int maxn=100005;

char T[maxn],S[15][maxn];
struct node {
    int l,r;
    bool operator < (const node &a) const 
    {
        return r<a.r; //重载小于号,按右端点从小到大排序
    }
};
vector<node>st;  //保存区间
int ne[maxn];

void KMP(char p[], char s[], int n, int m)
{
    for (int i = 2, j = 0; i <= n; i ++ )
    {
        while (j && p[i] != p[j + 1]) j = ne[j];
        if (p[i] == p[j + 1]) j ++ ;
        ne[i] = j;
    }

    for (int i = 1, j = 0; i <= m; i ++ )
    {
        while (j && s[i] != p[j + 1]) j = ne[j];
        if (s[i] == p[j + 1]) j ++ ;
        if (j == n)
        {
            //printf("%d ", i - n + 1);
            j = ne[j];
            st.push_back(node{i- n + 1,i});  
        }
    }
}

int main() 
{
    cin >> m;
    for(int i = 0; i < m; i++) cin >> S[i] + 1;
    cin >> T + 1;
    for(int i = 0; i < m; i++) {
        KMP(S[i], T, strlen(S[i] + 1), strlen(T + 1));
    }

    //贪心算法
    sort(st.begin(),st.end());
    int last=-1,ans=0;
    for(int i = 0; i < st.size(); i++)
     {
        if(st[i].l > last) 
        {
            last=st[i].r;
            ans++;
        }
    }
    cout << ans;
    return 0;
}
全部评论

相关推荐

叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务