题意:
如果字符串a的最后一个字符等于字符串b的第一个字符,那么,a,b是可连接的。又假设在一个字符串的链条中如果第一个字符串的第一个字符等于最后一个字符串的最后一个字符,这个链条是符合题意的。求长度最长的链条。
题解:
压缩+图论 奇葩的转移方程为了防止中间形成环。
#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#include<map>
using namespace std;
typedef long long lld;
const int oo=0x3f3f3f3f;
const lld OO=1e18;
const int Mod=1000000007 ;
const int maxn=100+5;
int maze[30][30];
char str[15];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(maze,0,sizeof maze);
for(int i=1;i<=n;i++)
{
scanf("%s",str);
int len=strlen(str);
int u=str[0]-'a',v=str[len-1]-'a';
for(int i=0;i<26;i++)
if(maze[i][u]&&maze[i][u]+len>maze[i][v])
maze[i][v]=maze[i][u]+len;
if(maze[u][v]<len) maze[u][v]=len;
}
int ans=0;
for(int i=0;i<26;i++)
if(ans<maze[i][i])
ans=maze[i][i];
printf("%d\n",ans);
}
return 0;
}
/**
*/