1 solutions

  • 0
    @ 2025-11-5 15:29:59

    C++ :

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    
    using namespace  std;
    string a[1000];
    int n;
    int ans=-1,b[10000]={0};
    int  jian(string a,string b)//b为原先的单词 
    {
    	/*if(a==b)
    	return 0;*/
    	//else
    	{
    		int p=-1;
    		for(int i=b.size()-1;i>=0;--i)
    		{
    			if(b[i]==a[0])
    			{
    				p=i;
    				break;
    			}
    		}
    		if(p==-1)
    		return 0;
    		else
    		{
    			int i=0;
    			while(p<=b.size()&&a[i]==b[p])
    			{
    				p++;
    				i++;
    			}
    			if(p==b.size())
    			return i;
    			else
    			return 0;
    		}
    	}
    }//试验了几次 应该没问题了 但重复中有重复的没有考虑 如abacd gjhgjaba 
    
    int dan(int l,string x,int p)//p为flag x为上次的末尾 l为现在的长度 
    {
    	if(p==0)
    	{
    		if(l>ans)
    		ans=l;
    	}
    	else
    	{
    		int k=0;
    		for(int i=2;i<=n+1;++i)
    		{
    			if(jian(a[i],x)>0&&b[i]<=1)
    			{
    				k=i;
    				b[i]++;
    				dan(l+a[i].size()-jian(a[i],x),a[i],k);
    				b[i]--;
    			}
    		}
    		if(k==0)
    		dan(l,x,0);
    	}
    }
    int main()
    {
    	//freopen("dcjl.in","r",stdin);
    	//freopen("dcjl.out","w",stdout);
    	cin>>n;
    	for(int i=2;i<=n+1;++i)
    	cin>>a[i];
    	cin>>a[1];
    	dan(1,a[1],1);
    	cout<<ans;
    }
    

    Pascal :

    Program long;
    Var
       x:array[1..20]of string;
       f:array[1..20,1..20]of integer;
       start:char;
       n,i,j,k,s1,s2,min,ans:integer;
       g:array[1..20]of integer;
    procedure dfs(i,p:integer);
       var j:integer;
       begin
       for j:=1 to n do
          if (g[j]<2)and(f[i,j]<>0)then
             begin
             inc(g[j]);
             dfs(j,p+f[i,j]);
             dec(g[j]);
             end;
       if p>ans then ans:=p;
       end;
    Begin
    readln(n);
    for i:=1 to n do readln(x[i]);
    for i:=1 to n do
       for j:=1 to n do
          begin
          s1:=length(x[i]);s2:=length(x[j]);
          if s1<s2 then min:=s1-1 else min:=s2-1;
          for k:=1 to min+1 do
             if (copy(x[i],s1-k+1,k)=copy(x[j],1,k)) then break;
          if k<=min then f[i,j]:=s2-k;
          end;
    readln(start);
    for i:=1 to n do
       if start=x[i][1] then
          begin
          fillchar(g,sizeof(g),0);
          g[i]:=1;
          dfs(i,length(x[i]));
          end;
    writeln(ans);
    End.
    
    • 1

    Information

    ID
    16858
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By