5
用字典树。后面还有一个参考答案代码,很短。
AC代码:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;char s[1001][10001];struct node{ int v; char now; node *next[26];};node root;void biuld(char *str) //创建字典树{ int i,len; len = strlen(str); node *p = &root,*q; for(i = 0; i < len; i++) { int id = str[i]-'a'; if(p->next[id]==NULL) { q=(node *)malloc(sizeof(root)); q->v = 1; for(int j = 0; j < 26; j++) { q->next[j] = NULL; } p->next[id] = q; p=p->next[id]; } else { p->next[id]->v++; p=p->next[id]; } }}/*void Dfs(int k,){}*/int findTrie(char *str){ int i; int len=strlen(str); node *p=&root; for(i=0;i<len;i++) { int id=str[i]-'a'; p=p->next[id]; if(p->v<=1) { return i+1; } } return i;}int main(){ int sum; int t,n,i; scanf("%d",&t); while(t--) { for(i = 0; i < 26; i++) //重置根节点 { root.next[i] = NULL; } sum = 0; scanf("%d",&n); for(i = 0; i < n; i++) { scanf("%s",&s[i]); biuld(s[i]); } for(i = 0; i < n; i++) { sum+=findTrie(s[i]); } printf("%d\n",sum); } return 0;}
参考代码:
// Yiming Li#include<cstdio>#include<cstring> #include<vector>#include<string>#include<algorithm>#include<cassert>using namespace std;vector<string> a;char s[1010000];int d[2000];int main(){ int i,j,l,t,n,ans; scanf("%d",&t); assert(t<=10); for (l=0;l<t;l++) { scanf("%d",&n); assert(1<=n&&n<=1000); a.clear(); int tot = 0; for (i=0;i<n;i++) { scanf("%s",s); tot += strlen(s); a.push_back(s); } assert(tot <= 1000000); sort(a.begin(),a.end()); memset(d,0,sizeof(d)); for (i=0;i+1<n;i++) { for (j=0;j<a[i].length()&&j<a[i+1].length();j++) if (a[i][j]!=a[i+1][j]) break; if (j+1>d[i]) d[i]=j+1; if (j+1>d[i+1]) d[i+1]=j+1; } ans=0; for (i=0;i<n;i++) ans+=d[i]; printf("%d\n",ans); } return 0;}