Pagini recente » Cod sursa (job #2802175) | Cod sursa (job #2936717) | Cod sursa (job #1616698) | Cod sursa (job #1369913) | Cod sursa (job #2675261)
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
ifstream f("prefix.in");
ofstream g("prefix.out");
char pattern[2000005];
int prefix[2000005], n;
void read()
{
f.getline(pattern+1, 2000005);
n = strlen(pattern+1);
memset(prefix, 0, sizeof(prefix));
}
void calcPrefix()
{
int j = 0;
for(int i = 2; i <= n; i++)
{
while(j > 0 && pattern[i] != pattern[j+1])
{
j = prefix[j];
}
if(pattern[i] == pattern[j+1])
{
prefix[i] = j+1;
j++;
}
}
}
int findMaxPref()
{
int j = 0;
for(int i = n; i >= 1; i--)
{
if(prefix[i] != 0)
{
int l = i - prefix[i];
int j = prefix[i];
while(prefix[j] != 0)
{
if(j - prefix[j] != l)
break;
j = prefix[j];
}
if(j == l)
{
return i;
}
}
}
}
void afisare()
{
for(int i = 1; i<=n; i++)
g<<prefix[i]<<" ";
g<<"\n";
}
int main()
{
int T;
f>>T;
f.get();
for(int i = 0; i<T; i++)
{
read();
calcPrefix();
//afisare();
g<<findMaxPref()<<"\n";
}
return 0;
}