题目网址点击打开链接
;
这个题题意是这样的:就是给你字符串进行两两比对,看需要比多少次==,注意相等时==结果ans+=2,如果此位不相等 ans+=1,并且结束比较
注意!!!所有的串的比较结束时要么两个不相等,要么至少一个到\0;但是
wa点来(wsb)
例 wsb wsb比较答案应该是8,而不是6 还需要比较最后一位的\0;
竟无语凝噎,因为这,我死磕了一下午加一晚上,就是不想跟着题解走,认为自己没错,竟然忘了uva有debug这个东西,可以帮忙,最后发现样例跟自己手算的答案都不一样,突然顿悟可能是我傻逼的又把题目搞错了
上代码:
两种代码,一种直接建树(小心一点内存够用,还不会TE),一种通过左儿子右兄弟建树
至于如何计数,加上\0之后,情况简单了很多,直接推一推,求一求自己画图一看就能推出来
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<queue>
#include<cstring>
#include<string>
#include<set>
#include<cmath>
#include<vector>
using namespace std;
const int maxmode=4000000+5;
const int maxn=40000+5;
long long ans;
struct node
{
int ch[maxmode][80];
int sz;
int cd;
int val[maxmode];
node()
{
sz=1;cd=0;
memset(ch,0,sizeof(ch));
memset(val,0,sizeof(val));
}
void build()
{
sz=1;cd=0;
memset(ch,0,sizeof(ch));
memset(val,0,sizeof(val));
}
int init(string a,int ff)
{
long long res=0;
int flag=0;
int u=0;
int n=a.size();
for(int i=0;i<n+1;i++)
{
int c;
if(i==n)
c=0;
else if(a[i]<='9'&&a[i]>='0')
c=a[i]-'0'+1;
else if(a[i]>='a'&&a[i]<='z')
c=a[i]-'a'+12;
else if(a[i]>='A'&&a[i]<='Z')
c=a[i]-'A'+40;
if(!ch[u][c])
{
flag=1;
res+=val[u];
ch[u][c]=sz++;
val[sz]=0;
}
else
{
res+=val[u];
res+=(val[ch[u][c]]);
}
val[u]++;
u=ch[u][c];
}
val[u]++;
return res;
}
};
node s;
int main()
{
int ka=0;
int n;
while(cin>>n&&n)
{
ka++;
s.build();
string a;
ans=0;
for(int i=0;i<n;i++)
{
cin>>a;
ans+=s.init(a,i);
}
printf("Case %d: ",ka);
cout<<ans<<endl;
}
return 0;
}
左右儿子
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<queue>
#include<cstring>
#include<string>
#include<set>
#include<cmath>
#include<vector>
using namespace std;
const int maxmode=4000000+5;
const int maxn=1000+5;
long long ans;
struct node
{
int son[maxmode];
int bro[maxmode];
int tot[maxmode];
char ch[maxmode];
int sz;
node()
{
sz=1;
son[0]=bro[0]=tot[0]=0;
}
void build()
{
sz=1;
son[0]=bro[0]=tot[0]=0;
}
int init(string a,int ff)
{
long long res=0;
int u=0,v;
int n=a.size();
for(int i=0;i<n;i++)
{
int flag=0;
for(v=son[u];v;v=bro[v])
{
if(ch[v]==a[i])
{
flag=1;
break;
}
}
if(!flag)
{
v=sz++;
res+=tot[u];
ch[v]=a[i];
son[v]=0;
bro[v]=son[u];
son[u]=v;
tot[v]=0;
}
else
{
res+=tot[u];
res+=(tot[v]);
}
tot[u]++;
u=v;
}
tot[u]++;
//cout<<res<<endl;
return res;
}
};
node s;
int main()
{
int ka=0;
int n;
string aa;
//freopen("out.txt","w",stdout);
//cout<<a<<endl;
while(cin>>n&&n)
{
ka++;
s.build();
string a;
ans=0;
for(int i=0;i<n;i++)
{
cin>>a;
a+=".";
ans+=s.init(a,i);
}
printf("Case %d: ",ka);
cout<<ans<<endl;
}
return 0;
}
如果\0记录一下错误理解题意
else
{
// cout<<"kjdfhsdjkfhjkerhg"<<endl;
if(c!=0)
res+=val[u];
if(c!=0)
res+=(val[ch[u][c]]);
else
res+=val[u]-val[ch[u][c]];
//if(ff==5&&c==0)
// cout<<val[ch[u][c]]<<endl;
//cout<<res<<endl;
}