Pagini recente » Cod sursa (job #1006454) | Cod sursa (job #2979264) | Cod sursa (job #3147811) | Cod sursa (job #2530888) | Cod sursa (job #927268)
Cod sursa(job #927268)
#include<fstream>
#include<string.h>
#include<vector>
#define nMax 1000
#define mMax 255
using namespace std;
vector <int> sol;
int Urm[mMax];
char T[nMax], P[mMax];
int n, m;
void Urmatorul(char *P)
{
int k=-1, x;
Urm[0]=0;
for(x=1; x<m; ++x)
{
while(k>0 && P[k+1]!=P[x]) k=Urm[k];
if(P[k+1] == P[x]) k++;
Urm[x]=k;
}
}
int main()
{
int i, x=-1;
ifstream f("KMP.in");
ofstream g("KMP.out");
f.getline(P, 255); f.getline(T, 1000);
n=strlen(T); m=strlen(P);
Urmatorul(P);
for(i=0; i<n; ++i)
{
while(x>0 && P[x+1]!=T[i]) x=Urm[x];
if(P[x+1] == T[i]) x++;
if(x == m-1)
{
sol.push_back(i-m+1);
x=Urm[x];
}
}
g<<sol.size()<<"\n";
for(i=0; i<sol.size(); ++i)
g<<sol[i]<<" ";
g.close();
return 0;
}