Cod sursa(job #1439671)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 22 mai 2015 22:47:38
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <vector>
#include <fstream>
#include <string>
using namespace std;

constexpr int maxsz = 1000000;

// 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(maxsz);
	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(maxsz);
	for(int i = 0; i < n; ++i){
		str.clear();
		f >> str;
		g << find_rez(str) << '\n'; }
	return 0; }