1 solutions
-
0
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