P1738 Luogu
發一個鏈表題解!
僅有24ms,排名第一哦~
圓圈代表點,每個店有兩個指針,一個指向自己兄弟(同級文件夾),另一個指向自己孩子(子文件夾),還有一個保存當前名字。
有點像二叉樹孩子兄弟表示法……
那么我們從根節點尋找。對於每個節點,先找他的兄弟有沒有符合要求的當前級名字,如果有,轉到該兄弟的孩子節點上;如果沒有,那就新建一個,計數器+1。
20180527
代碼:
#include <cstdio>
#include <cstring>
const int S=101;
int n,res=0,l,i,j;
char o[S],r[S];
struct info
{
struct info *c,*b;
char a[S];
}*root;
void dfs(int i,struct info *&p,bool fg,char r[])
{
if (!o[i] && fg) return;
int j=i;
if (fg)
{
for (j=i+1;o[j] && o[j]!='/';j++) r[j-i-1]=o[j];
l=j-i-1;r[l]=0;
}
if (p && strcmp(p->a,r)) dfs(j,p->b,false,r);
else
{
if (!p)
{
p=new struct info;
strcpy(p->a,r);res++;
p->b=p->c=NULL;
}
dfs(j,p->c,true,r);
}
}
int main()
{
scanf("%d",&n);
while (n--)
{
scanf("%s",&o);
dfs(0,root,true,r);
printf("%d\n",res);
}
return 0;
}
很簡潔吧!:)