Problem:A head to tail ordering of strings is the one in which the last letter of the previous word is the same as the first letter of the following word. For eg. ‘Angular’can be followed by ‘ rotation’.
The task is to write a code to accept a set of finite strings and determine if such an ordering is possible by arranging them in a head to tail sequence.
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <cstdio>
using namespace std;
map<string,int> mp;
map<int,string> pm;
vector<string> vb[27];
int res[105];
int t,n;
bool dfs(bool vis[],int v,int cnt)
{
if(cnt==n-1)
{
return 1;
}
string s=pm[v];
int idx=(s[s.size()-1]-'a')+1;
// vis[v]=1;
bool f=0;
for(int i=0;i<vb[idx].size();i++)
{
s=vb[idx][i];
if(vis[mp[s]]==0)
{
vis[mp[s]]=1;
res[cnt+1]=mp[s];
f=dfs(vis,mp[s],cnt+1);
vis[mp[s]]=0;
if(f)
return 1;
}
}
return 0;
}
int main() {
//code
bool vis[105];
scanf("%d",&t);
string str;
int idx;
bool f;
while(t--)
{
scanf("%d",&n);
mp.clear();
pm.clear();
f=0;
for(int i=1;i<27;i++)
vb[i].clear();
for(int i=1;i<=n;i++)
{
cin>>str;
mp[str]=i;
pm[i]=str;
vis[i]=0;
idx=(str[0]-'a')+1;
vb[idx].push_back(str);
}
for(int i=1;i<=n;i++)
{
if(vis[i]==0)
{
res[0]=i;
vis[i]=1;
f=dfs(vis,i,0);
vis[i]=0;
}
if(f)
break;
}
if(f)
printf("Head to tail ordering is possible.\n");
else
printf("Head to tail ordering is not possible.\n");
}
return 0;
}