Pagini recente » Cod sursa (job #2340892) | Cod sursa (job #1751691) | Cod sursa (job #713473) | Cod sursa (job #1949846) | Cod sursa (job #1815417)
#include <bits/stdc++.h>
#define NMAX 10005
using namespace std;
ifstream fin ("potrivire.in");
ofstream fout("potrivire.out");
int P[NMAX];
string A,B;
void prefix(int n){
int q = 0;
for(int i = 2; i <= n; i++){
while(q && B[i] != B[q + 1] && B[i] != '*' && B[q + 1] != '*')
q = P[q];
if(B[i] == B[q + 1] || B[i] == '*' || B[q + 1] == '*' )
q++;
P[i] = q;
}
}
int potrivire(int n,int m){
int q = 0,k = 0;
for(int i = 1; i <= n; i++){
while(q && B[q + 1] != A[i] && B[q + 1] != '*')
q = P[q];
if(B[q + 1] == A[i] || B[q + 1] == '*'){
while(A[i] != B[q + 1])
i++;
}
k++;
if(q == m){
fout << i - m + 1 << " " << i ;
return 1;
}
}
return 0;
}
int main()
{
ios :: sync_with_stdio(false);
fin.tie(NULL);
int n,m;
fin >> n >> m;
fin >> A >> B;
A = "$" + A;
B = "$" + B;
// prefix(m);
int p = 0;
for(int i = 1; i <= m; i++)
{
if(!potrivire(n,m))
fout << -1;
}
if(B[i] == '*')
prefix(i,m);
for(int i = 1;i <= m; i++){
fout << P[i] << " ";
}
if(!potrivire(n,m))
fout << -1;
return 0;
}