Cod sursa(job #8807)

Utilizator gigi_becaliGigi Becali gigi_becali Data 25 ianuarie 2007 17:25:02
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <cstdio>
#include <iostream>
#include <fstream>
#include <deque>
#include <vector>
#include <set>
#include <string>
using namespace std;
string a, b;
int n, m;
int s[32], poz1,poz2;
string r;
string sol;
int nsize=0x3f3f3f3f;
vector<string>Sol;
void afis(string a)
{
	if(a.size()<(unsigned)nsize){ sol=a, nsize=a.size();Sol.clear(); Sol.push_back(a);}
	else if(a.size()==(unsigned)nsize) Sol.push_back(a);
}



void back(int k, string a)
{

	if(k==m) afis(a);
	else
	{
		int i;
			if(a.size()==1)
			{
				a+=b[k];
				back(k+1,a);
			}
			else
			{
				for(i=1;i<(signed)a.size()-1;i++)
				{
					string t=a.substr(0, i);
					t+=b[k];
					t+=a.substr(i, a.size());
				
					int ok=1;
					while(ok)
					{
						
						ok=0;
						s[0]=1;
						poz1=-1, poz2=-1;
						for(int j=1;j<(signed)t.size();j++)
							if(t[j]==t[j-1]) s[j]=s[j-1]+1;
								else { s[j]=1; if(s[j-1]>=3) poz2=j-1,poz1=j-s[j-1];ok=1;} 
						
								{
						
						int j=t.size();
						if(s[j-1]>=3) poz2=j-1,poz1=j-s[j-1];
					}
						
						if(poz1==-1 || poz2==-1) break;
						ok=1;
						t.erase(t.begin()+poz1,t.begin()+poz2+1);
						if(t.size()==0){ printf("%d\n", k+1); exit(0);}
						
					}
				
					back(k+1,t);
				}
			}
	}
}
	
int main()
{
	
	ifstream f("balls.in");
	freopen("balls.out", "w", stdout);
	f>>a; f>>b;
	n=a.size();
	m=b.size();
	
	back(0, a);
	
	
	set<string> Q(Sol.begin(), Sol.end());

	for(set<string>::iterator it=Q.begin();it!=Q.end();it++)printf("%s\n", it->c_str());
	return 0;
}