Cod sursa(job #3037830)

Utilizator OrzaSERBANSerban Orza OrzaSERBAN Data 26 martie 2023 15:46:42
Problema Prefix Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("prefix.in");
ofstream g("prefix.out");

int n,m,nr;
string text,s;
int lps[1000001];
void createlps(string s)
{
    int i=1,j=0;
    for(i=0;i<m;i++)
        lps[i]=0;
    i=1;
    m=s.size();
    while(i<m)
    {
        if(s[i]==s[j])
        {
            lps[i]=j+1;
            i++;
            j++;
        }
        else
            if(j>0)
            j=lps[j-1];
        else
        {
            lps[i]=0;
            i++;
        }
    }
}
void kmp(string text, string s)
{
    n=text.size();
    m=s.size();
    createlps(s);
    int i=0,j=0;
    while(i<n)
    {
        if(text[i]==s[j])
        {
            i++;
            j++;
        }
        else
            if(j>0)
            j=lps[j-1];
        else
            i++;
        if(j==m)
        {
            nr++;//i-j e indexul unde l-am gasit
            j=lps[j-1];
        }
    }
}
int main()
{
    int t,i,j,k;
    f>>t;
    for(i=1;i<=t;i++)
    {
        f>>s;
        createlps(s);
        //for(j=0;j<s.size();j++)
       //     g<<lps[j]<<" ";
       // g<<'\n';
        nr=0;
        for(j=1;j<s.size();j++)
        {
            //cautam daca j+1 e solutie
            //daca de la 0 la j avem ceva ce se repeta
            //j+1 e lungimea
            //lps[j] e lungimea max prefix sufix din 0,j
            if(lps[j]>0 and lps[j]%(j+1-lps[j])==0)//sau and(j+1)%(j+1-lps[j])==0)
                nr=j+1;
        }
        g<<nr<<'\n';
    }
    return 0;
}