Pagini recente » Profil Tomita102 | Cod sursa (job #2255298) | Cod sursa (job #1506374) | Cod sursa (job #2390636) | Cod sursa (job #3170592)
#include <fstream>
#include <string>
using namespace std;
ifstream cin("strmatch.in");
ofstream cout("strmatch.out");
string pattern;
string string1;
int n,m;
int p[2000000001];
void lsp()
{
int i=2;
p[0]=-1;
while(i<n)
{
int j=p[i-1];
while(j>0 && string1[j+1]!=string1[i])
{
j=p[j]+1;
}
if(string1[j+1]==string1[i])
{
j++;
}
p[i]=j;
i++;
}
}
int nr=0;
int a[2000000001];
void kmp()
{
int i=1,j=1;
while(i<=m)
{
while(j>0 && pattern[i]!=string1[j])
{
j=p[j-1]+1;
}
i++, j++;
if(j==n)
{
a[nr]=i-j;
nr++;
j=p[j-1]+1;
}
}
}
int main()
{
cin>>string1;
cin>>pattern;
string1='$'+string1;
n=string1.size();
pattern='$'+pattern;
m=pattern.size();
lsp();
kmp();
cout<<nr<<endl;
for(int i=0;i<nr;i++)
{
cout<<a[i]<<" ";
}
return 0;
}