Pagini recente » Cod sursa (job #1262769) | Cod sursa (job #1643578) | Cod sursa (job #584419) | Cod sursa (job #1799523) | Cod sursa (job #2060684)
#include <iostream>
#include <fstream>
#include <string.h>
#include <vector>
#define NMAX 2000005
using namespace std;
ifstream fin("prefix.in");
ofstream fout("prefix.out");
int cnt, t;
int S[NMAX];
char sir[NMAX], key[NMAX];
vector <int> rsp;
void kmp(char sir[], char key[])
{
int n = strlen(sir + 1);
int m = strlen(key + 1);
S[0] = -1;
S[1] = 0;
for (int i = 2; i <= m; i++)
{
int prv = i - 1;
char ch = key[i];
while (S[prv] != -1 && key[S[prv] + 1] != ch)
prv = S[prv];
S[i] = S[prv] + 1;
}
int lst = 0;
for (int i = 1; i <= n; i++)
{
while (lst != -1)
if (key[lst + 1] == sir[i])
break;
else lst = S[lst];
lst++;
if (lst == m)
{
if ((rsp.empty() && i - m == 0) || (i - m) == rsp[rsp.size() - 1] + m)
{
rsp.push_back(i - m);
lst = S[lst];
}
else break;
}
}
}
int main()
{
fin >> t;
while (t--)
{
fin >> (sir + 1);
int n = strlen(sir + 1);
int mx = 0;
for (int i = 1; i <= n / 2; i++)
{
rsp.clear();
strcpy(key + 1, sir + 1);
strcpy(key + i + 1, "");
kmp(sir, key);
if (rsp.size() > 1)
{
int m = rsp.size() * strlen(key + 1);
mx = max(mx, m);
}
}
fout << mx << "\n";
}
return 0;
}