NAJPF - Pattern Find - SPOJ Solution C++

  Problem Link : NAJPF 


👉 Hint : Standard Pattern Searching(KMP or some other algorithm like Rabin-Karp etc.)

 


✅ C++ Solution :

 
#include<bits/stdc++.h>
using namespace std;
 
int F[1000001];
vector<int> vec;
void build_failure(string pattern)
{
    int j;
    vec.clear();
    memset(F,0,sizeof(F));
    F[0]=0;
    for(int i=1;i<pattern.length();i++)
    {
        j=F[i-1];
        while(j!=0)
        {
            if(pattern[j]==pattern[i])
            {
                F[i]=j+1;
                break;
            }
            else j=F[j-1];
            
        }
        if(pattern[0]==pattern[i])
            F[i]=1;
    }
}
 
void kmp(string text,string pattern)
{
    int i=0,j=0,cnt=0;
    int n=text.length();int m=pattern.length();
    while(i<n)
    {
        if(text[i]==pattern[j])
        {
            i++,j++;
            if(j==m)
            {
                cnt++;
                vec.push_back(i-m+1);
                j=F[j-1];
            }
        }
        else if (j>0)
            j=F[j-1];
        else
            i++;
    }
    if(cnt>0)
    {
        cout<<cnt<<"\n";
        for(i=0;i<vec.size();i++)
            cout<<vec[i]<<" ";
    
            
    }
    else
        cout<<"Not Found";
    cout<<"\n\n";    
 
}
 
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        string text,pattern;
        cin>>text>>pattern;
        build_failure(pattern);
        kmp(text,pattern);
    }
} 

 

Thank you for your patience reading. If you enjoyed this post, I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Whatsapp or Facebook. 

😇Happy Learning!!