先放这儿,有时间再调
AC:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <ctype.h>
#include <stack>
#include <iostream>
#define sigma_size 26
using namespace std;
const int Max =4000*1000+10;
int son[Max];
int bro[Max];
char ch[Max];
int val[Max];
int flag[Max];
int cnt;
long long ans;
void insert(const char *s)
{
ans+=val[0];
val[0]++;
int i,n=strlen(s);
int u=0;
int v;
for(i=0;i<n;i++)
{
bool found=false;
for(v=son[u];v!=0;v=bro[v])
if(ch[v]==s[i])
{
found=true;
break;
}
if(!found)
{
v=cnt++;
val[v]=0;
flag[v]=0;
ch[v]=s[i];
bro[v]=son[u];
son[u]=v;
son[v]=0;
}
u=v;
ans+=val[u]*2;
val[u]++;
}
if(flag[v])ans+=flag[v];//这个是用于统计相同字符串的个数 开始没有这个一直WA 比如3 个a 那么要比较 6次
flag[v]++;
//ans=temp;
}
char str[1010];
int main()
{
// freopen("in.txt","r",stdin);
int n,num=1;
while(scanf("%d",&n),n)
{
ans=0;
cnt=1;
val[0]=0;
son[0]=bro[0]=0;
while(n--)
{
scanf("%s",str);
insert(str);
}
printf("Case %d: %lld\n",num++,ans);
}
return 0;
}
TLE:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define LL long long int
#define MAX 127
using namespace std;
LL ans=0;
typedef struct Trie {
Trie *next[MAX];
int v; //根据需要变化
};
Trie *root;
void createTrie(char str[]) {
int len = strlen(str);
str[len]=0;
len++;
Trie *p = root, *q;
for(int i=0; i<len; ++i) {
int id = str[i];
if(p->next[id] == NULL) {
q = (Trie *)malloc(sizeof(Trie));
q->v = 1; //初始v==1
for(int j=0; j<MAX; ++j)
q->next[j] = NULL;
p->next[id] = q;
p = p->next[id];
} else {
p->next[id]->v++;
p = p->next[id];
}
}
// p->v = -1; //若为结尾,则将v改成-1表示
}
LL C(LL n){
if(n==1) return 1;
else return n*(n-1)/2;
}
void findTrie(Trie *p){
LL num[MAX];
int cnt=0;
for(int i=0;i<MAX;i++){
if(p->next[i]!=NULL){
num[cnt]=p->next[i]->v;
if(num[cnt]!=1) {
ans=ans+C(num[cnt])*2;
//printf("C(num[cnt])*2=%I64d\n",C(num[cnt])*2);
}
cnt++;
}
}
for(int i=0;i<cnt;i++){
for(int j=i+1;j<cnt;j++){
ans+=num[i]*num[j];
// printf("C(num[i])*C(num[j])=%I64d\n",C(num[i])*C(num[j]));
}
}
for(int i=0;i<MAX;i++){
if(p->next[i]!=NULL){
findTrie(p->next[i]);
}
}
return ;
}
int main() {
LL N,cas=1;
while(~scanf("%I64d",&N),N) {
char str[1009];
root = (Trie *)malloc(sizeof(Trie));//main函数中需要对root申请内存,并且memset为0
for(int i=0;i<MAX;i++) root->next[i]=NULL;
ans=0;
for(int i=0;i<N;i++) {
memset(str,0,sizeof(str));
scanf("%s",str);
createTrie(str);
}
findTrie(root);
printf("Case %I64d: %I64d\n",cas,ans);
}
return 0;
}