NOIP2000T4 单词接龙
#include<iostream> #include<string> using namespace std; string words[21];//words[0]存取龙头,剩下的存取单词 int record[21];//存取每个单词的访问次数(每个单词最多只能用两次~~) int n; int sum=0;//存取最长的龙的长度 int conn_len(int i,int j){ int min_len=min(words[i].size(),words[j].size()); for(int k=1;k<=min_len;k++){ if(words[i].substr(words[i].size()-k,k)==words[j].substr(0,k))//在这里截取字符串,words[i]从最后一个开始截取,words[j]从第一个截取,每截取一次就判断一下是否相同,相同的话就返回剩下的长度 return words[j].size()-k; } return 0; } void dfs(int len,int p){ sum=max(sum,len);//每加上一个单词就更新一次最大长度 for(int i=1;i<=n;i++){ if(record[i]>1)continue; int k=conn_len(p,i); if(!k)continue; record[i]++; dfs(len+k,i); record[i]--; } } int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>words[i]; cin>>words[0]; dfs(1,0); cout<<sum<<endl; return 0; }
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; char word[25][100],fir[10]; int ans,n,check[25]; bool str_cmp(char *a,char *b){ int len=strlen(a); for(int i=0;i<len;i++) if(a[i]!=b[i]) return false; return true; } void DFS(char *s,int wei){ ans=max(ans,wei); int len=strlen(s); for(int i=1;i<len;i++) for(int j=1;j<=n;j++) if(str_cmp(s+i,word[j]) && check[j]){ check[j]--; DFS(word[j],wei-len+i+strlen(word[j])); check[j]++; } } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%s",word[i]); scanf("%s",fir+1); fir[0]=1; for(int i=1;i<=n;i++)check[i]=2; DFS(fir,1); printf("%d\n",ans); return 0; }
var c:array[0..20,0..20] of longint; b,d:array[0..20] of longint; s:array[1..20] of string; ch:char; n,i,j,k,t,max:longint; function check(i,j:longint):longint; var k,l1,l2,l:longint; begin if d[i]<d[j] then l:=d[i] else l:=d[j]; for k:=1 to l-1 do if copy(s[i],d[i]-k+1,k)=copy(s[j],1,k) then exit(k); exit(0); end; procedure work(k,s:longint); var i,j:longint; begin if s>max then max:=s; for i:=1 to n do if (b[i]<2) and (c[k,i]>0) then begin inc(b[i]); work(i,s+d[i]-c[k,i]); dec(b[i]); end; end; begin assign(input,'dcjl.in'); reset(input); assign(output,'dcjl.out'); rewrite(output); readln(n); for i:=1 to n do begin readln(s[i]); d[i]:=length(s[i]); end; readln(ch); for i:=1 to n do for j:=1 to n do c[i,j]:=check(i,j); for i:=1 to n do if s[i][1]=ch then begin b[i]:=1; work(i,d[i]); b[i]:=0; end; writeln(max); close(input); close(output); end.