Pagini recente » Cod sursa (job #3240655) | Cod sursa (job #807856) | Arhiva de probleme | Cod sursa (job #1122214) | Cod sursa (job #1276489)
#include <cstdio>
#include <cstring>
#include <vector>
#define N 2000002
#define mod1 9999901
#define mod2 9999907
#define p 173
char substr[N];
char str[N];
int main ()
{
FILE *fin=fopen("strmatch.in","r");
FILE *fout=fopen("strmatch.out","w");
fscanf(fin, "%s %s", substr, str);
int len_substr = strlen(substr);
int len_str = strlen(str);
int p_k1=1, p_k2=1;
for(int i=0; i<len_substr; i++)
{
p_k1 = (p*p_k1) % mod1;
p_k2 = (p*p_k2) % mod2;
}
int substr1=0, substr2=0, str1=0, str2=0;
for(int i=0; i<len_substr; i++)
{
substr1 = (substr1*p + substr[i]) % mod1;
substr2 = (substr2*p + substr[i]) % mod2;
}
for(int i=0; i<len_substr; i++)
{
str1 = (str1*p + str[i]) % mod1;
str2 = (str2*p + str[i]) % mod2;
}
std::vector<int> v;
for(int i=len_substr; i<len_str; i++)
{
printf("%d %d %d %d\n", substr1, str1, substr2, str2);
if(str1==substr1 and str2==substr2)
{
v.push_back(i);
}
str1 = ((str1*p) % mod1 + str[i] - (p_k1*str[i-len_substr]) % mod1 + mod1) % mod1;
str2 = ((str2*p) % mod2 + str[i] - (p_k2*str[i-len_substr]) % mod2 + mod2) % mod2;
}
fprintf(fout, "%d\n", v.size());
int i=1;
for(auto& e: v)
{
fprintf(fout, "%d ", e-len_substr);
if(++i>1000)
break;
}
return 0;
}