Pagini recente » Cod sursa (job #1486849) | Cod sursa (job #3204861) | Cod sursa (job #1178512) | Cod sursa (job #3201254) | Cod sursa (job #3201257)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("adn.in");
ofstream fout ("adn.out");
int const mod1 = 666013;
string s[20];
long long put(long long A, int N, int mod)
{
long long P = 1;
for(int k = 1; k <= N; k <<= 1)
{
if( (N & k) )
P = P * A % mod;
A = A * A % mod;
}
return P;
}
long long get_end_Hash1(int i, int Poz)
{
int H = (Hash1[i][s[i].size() - 1] - Hash1[i][s[i].size() - 1 - Poz - 1]) * inv_mod(put(27, s[i].size() - Poz - 1, mod1), mod1);
}
int main()
{
fin >> n;
for(int i = 1; i <= n; ++i)
{
fin >> s[i];
Hash1[i][0] = s[0];
for(int j = 1; j < s[i].size(); ++j)
{
Hash1[i][j] = Hash1[i][j - 1] + s[i][j] * put(27, j, mod1);
}
}
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
if(i != j)
{
int L = min(s[i].size(), s[j].size());
int poz = 0;
int rez = 0;
for(int p = 20; p >= 0; --p)
{
if(poz + (1 << p) <= L && Hash1[j][poz + (1 << p)] == get_end_Hash1(i, poz + (1 << p)))
{
poz = poz + (1 << p);
rez = poz + 1;
}
}
if(poz <= L && Hash1[j][poz] == get_end_Hash1(i, poz))
rez = poz + 1;
C[i][j] = rez;
}
\
return 0;
}