Pagini recente » Cod sursa (job #2840436) | Cod sursa (job #2485757) | Cod sursa (job #1546731) | Cod sursa (job #1134527) | Cod sursa (job #2955110)
/// Cerinta
/*
Se dau doua siruri A si B formate din litere mici si mari ale alfabetului englez si din cifre. Se cere gasirea tuturor aparitiilor sirului A ca subsecventa a sirului B.
Date de intrare
Fisierul de intrare strmatch.in contine 2 linii cu sirurile A, respectiv B.
Date de iesire
In fisierul de iesire strmatch.out se va afla pe prima linie numarul N de aparitii a sirului A in sirul B. Pe urmatoarea linie se vor afla N numere care reprezinta pozitiile in care sirul A se potriveste peste sirul B, afisate in ordine crescatoare. Pentru a evita fisierele de output foarte mari, in cazul in care N este mai mare decat 1000 se vor afisa doar primele 1000 de pozitii. Sirurile sunt indexate de la 0.
Restrictii
Lungimea sirurilor A si B se afla in intervalul [1, 2 000 000]
*/
/// Rezolvare - KMP
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define pf push_front
#define MOD 1000000007
#define MAX 2000005
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
int main()
{
vector < int > raspuns;
string s1, s2;
int n, m, i, k, p[MAX+MAX];
fin >> s1 >> s2, n = s1.size(), m = s2.size();
if(n > m) fout << 0;
else
{
s1 += '#';
s1 += s2;
p[0] = -1;
for(i = 1; i <= n + m + 1; i++)
{
k = p[i-1];
while(k >= 0 && s1[k] != s1[i-1]) k = p[k];
p[i] = k + 1;
if(p[i] == n) raspuns.pb(i - n - n - 1);
}
if(raspuns.size() <= 1000)
{
fout << raspuns.size() << '\n';
for(auto it:raspuns) fout << it << ' ';
}
else
{
fout << raspuns.size() << '\n';
for(i = 0; i < 1000; i++) fout << raspuns[i] << ' ';
}
}
return 0;
}
/// Exemple
/*
IN:
ABA
CABBCABABAB
OUT:
2
5 7
*/