Pagini recente » Cod sursa (job #2032040) | Clasament dupa rating | Profil Danna17 | Diferente pentru utilizator/eugenstoica intre reviziile 11 si 10 | Cod sursa (job #2360131)
#include <fstream>
#include <cstring>
#define crypt 256
#define MOD1 100007
#define MOD2 100021
#define NMAX 1000005
using namespace std;
ifstream fin("prefix.in");
ofstream fout("prefix.out");
char sir[NMAX];
int h1 = 1, h2 = 1, lgT = 0;
int Rabin_karp(int lg){
int hs1 = 0;
int hs2 = 0;
for(int i = 0; i < lg; ++i){
hs1 = (hs1 * crypt + sir[i]) % MOD1;
hs2 = (hs2 * crypt + sir[i]) % MOD2;
}
int sh1 = hs1;
int sh2 = hs2;
int rez = 0;
int times = 0;
int bad = 0;
for(int i = 0; i <= lgT - lg; ++i){
if(sh1 == hs1 && sh2 == hs2 && (bad == lg - 1 || i == 0))
rez += lg, ++times, bad = 0;
else {
++bad;
if(bad == lg)
break;
}
sh1 = (crypt * (sh1 - (sir[i] * h1) % MOD1 + MOD1) + sir[i + lg]) % MOD1;
sh2 = (crypt * (sh2 - (sir[i] * h2) % MOD2 + MOD2) + sir[i + lg]) % MOD2;
}
if(times >= 2)
return rez;
return 0;
}
int main()
{
int t;
fin >> t;
fin.get();
while(t--){
fin.getline(sir, NMAX - 1);
lgT = strlen(sir);
int maxx = 0;
for(int i = 2; i < lgT; ++i){
for(int j = 1; j < i; ++j){
h1 = (h1 * crypt) % MOD1;
h2 = (h2 * crypt) % MOD2;
}
int lgPrefi = Rabin_karp(i);
h1 = 1;
h2 = 1;
maxx = max(maxx, lgPrefi);
}
fout << maxx << '\n';
}
return 0;
}