Pagini recente » Cod sursa (job #1005538) | Cod sursa (job #1190358) | Cod sursa (job #182855) | Cod sursa (job #2272490) | Cod sursa (job #1439670)
#include <vector>
#include <fstream>
#include <string>
using namespace std;
// pe scurt, calculam functia de esec pentru algoritmul Knuth - Morris - Pratt
// folosind informatia lui, deducem rezultatul
// de exemplu, sirul
// axaxbybyaxaxbyby ar da sirul asociat(functia de esec e un sir):
// 1012000012345678
// raspunsul se deduce din faptul ca la pozitia 16 avem 8 :)
int find_rez(const string& str){
static vector<int> v;
v.clear();
v.resize(str.size(), 0);
int jumper = 0;
for(int i = 1; i < str.size(); ++i){
while(jumper != 0 && str[i] != str[jumper]){
jumper = v[jumper-1]; }
if(str[i] == str[jumper]){
++jumper; }
v[i] = jumper;
/* asta inseamna ca la inceputul loop-ului,
jumper e initializat la val[i-1] */ }
for(int i = v.size(); i >= 1; --i){
if(v[i-1] && i % (i-v[i-1]) == 0){
return i; } }
return 0; }
int main(){
ifstream f("prefix.in");
ofstream g("prefix.out");
int n;
f >> n >> ws;
string str;
str.reserve(1000000);
for(int i = 0; i < n; ++i){
str.clear();
f >> str;
g << find_rez(str) << '\n'; }
return 0; }