求调,编译运行可以输出正确答案P1019
  • 板块学术版
  • 楼主Papbc
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/14 14:42
  • 上次更新2024/8/14 16:09:13
查看原帖
求调,编译运行可以输出正确答案P1019
1271478
Papbc楼主2024/8/14 14:42
#include<bits/stdc++.h>

using namespace std;

inline int read()
{
	register int x=0;
	register char ch=getchar();
	while(ch>'9'||ch<'0')ch=getchar();
	while(ch>='0'&&ch<='9')
	x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
	return x;
}

inline void write(int x)
{
	if(x>=10)write(x/10);
	putchar(x%10+'0');
}

struct p
{
	int next,to,bad;
}
edge[484];

int n;
char s[21][110086];
int bd;
int head[484],cnt=1;
int flag[21];
int len[21];
int ans;
char c;

inline void add(int from,int to,int bad)
{
	edge[cnt].bad=bad;
	edge[cnt].to=to;
	edge[cnt].next=head[from];
	head[from]=cnt++;
}

inline bool check(int x,int y)
{
	int minlen=min(len[x],len[y]);
	int nflag=0;
	bd=1;
	for(int i=1;i<minlen;i++)
	{
		nflag=1;
		for(int j=1;j<=i;j++)
		{
			if(s[x][len[x]-i+j]!=s[y][j])
			{
				nflag=0;
				break;
			}
		}
		if(nflag)return 1;
		bd++;
	}
	return 0;
}

inline void dfs(int st,int val)
{
	if(val>ans)ans=val;
	for(int i=head[st];i;i=edge[i].next)
	{
		int v=edge[i].to;
		if(flag[v]==2)continue;
		flag[v]++;
		dfs(v,val+len[v]-edge[i].bad);
		flag[v]--;
	}
}

int main()
{
	n=read();
	for(int i=1;i<=n;i++)
	{
		scanf("%s",s[i]+1);
		len[i]=strlen(s[i]+1);
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(check(i,j))
			add(i,j,bd);
		}
	}
	c=getchar();
	c=getchar();
	for(int i=1;i<=n;i++)
	{
		flag[i]=1;
		if(s[i][1]==c)dfs(i,len[i]);
		flag[i]=0;
	}
	write(ans);
}
2024/8/14 14:42
加载中...