diego_engcomp wrote:But my problem isn't time. My code runs in 2 secs. I get WA not TLE. Can you post some critical test cases please?
try this !!
Code: Select all
roaster
coastal
postal
booster
roasted
coasted
rooster
booster roasted
coastal postal
Code: Select all
booster
rooster
roaster
roasted
No solution.
No solution.
congratulation
![:)](./images/smilies/icon_smile.gif)
your code got AC 1.208
you process always one more case
I edited your code like this !!
Code: Select all
//Doublets
/* @JUDGE_ID: 00000 10150 C++ */
//Técnicas Utilizadas: BFS
#include <iostream>
#include <string.h>
#include <vector>
#include <deque>
using namespace std;
int palavras=0;
char dicionario[25500][20];
int tamanhos[25500];
vector< deque<int> > grafo(25500,deque<int>());
bool isDoublet(char str1[], int &tam1, char str2[], int &tam2){
if (tam1!=tam2)
return false;
int conta=0;
for (int i=0; i<tam1; i++){
if (str1[i]!=str2[i]){
conta++;
if (conta>1)
return false;
}
}
return true;
}
bool bfs(int start, int end, vector<int> &parent){
vector<bool> discovered(palavras+1,false);
deque <int> q;
int v, i;
q.push_back(start);
discovered[start]=true;
while (q.size()) {
v = q.front();
q.pop_front();
for (i=0; i<grafo[v].size(); i++)
if (discovered[grafo[v][i]]==false){
q.push_back(grafo[v][i]);
discovered[grafo[v][i]]=true;
parent[grafo[v][i]]=v;
if (discovered[end])
return true;
}
}
return false;
}
void find_path(int start, int end, vector<int> &parent){
if ( (start==end) || (end==-1)){
printf("%s\n",dicionario[end]);
}else{
find_path(start,parent[end],parent);
printf("%s\n",dicionario[end]);
}
}
int main(){
/*freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);//*/
while(1){
scanf("%s",dicionario[palavras]);
tamanhos[palavras]=strlen(dicionario[palavras]);
for(int i=palavras-1; i>=0; i--){
if(isDoublet(dicionario[i],tamanhos[i],dicionario[palavras],tamanhos[palavras])){
grafo[palavras].push_back(i);
grafo[i].push_back(palavras);
}
}
cin.ignore();
if(cin.peek()=='\n')
break;
palavras++;
}
cin.ignore();
int i=0;//------
while(1){
char origem[20], destino[20];
int origemidx=-1,destinoidx=-1;
scanf("%s %s",origem,destino);
cin.ignore();
if(cin.eof())
break;
if(i++)
printf("\n");
if(strlen(origem) != strlen(destino) ){
printf("No solution.\n");
continue;
}
for(int i=0; i<=palavras; i++)
if(strcmp(dicionario[i],origem)==0){
origemidx=i;
break;
}
for(int i=0; i<=palavras; i++)
if(strcmp(dicionario[i],destino)==0){
destinoidx=i;
break;
}
if(origemidx==-1 || destinoidx==-1){
printf("No solution.\n");
}
else{
vector<int> parent(palavras+1,-1);
if(bfs(origemidx,destinoidx,parent))
find_path(origemidx,destinoidx,parent);
else
printf("No solution.\n");
}
}
return 0;
}