记录编号 73887 评测结果 AAAAAAAAAA
题目名称 [NOI 2000]单词查找树 最终得分 100
用户昵称 Gravatarranto 是否通过 通过
代码语言 C++ 运行时间 0.006 s
提交时间 2013-10-23 13:19:32 内存使用 0.31 MiB
显示代码纯文本
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>
#include <string>
#define itn int

using namespace std;

ifstream in("trie.in");
ofstream out("trie.out");

long ans(1);
vector<string> vs;

void input();
void proc();
void output();

int main()
{
	input(); 
	proc();  
	output();
	return 0;
}

void input()
{
	while(!in.eof())
	{
		register string stemp;
		in>>stemp;
		if(stemp=="")
		{
			continue;
		}
		vs.push_back(stemp);
	}
	return ;
}

struct node
{
	int start;
	int end;
	int depth;
};

node make(itn a,itn b,itn c)
{
	node ret;
	ret.start=a;
	ret.end=b;
	ret.depth=c;
	return ret;
}

void bfs()
{
	queue<node> q;
	int start(0);
	itn end(-1);
	char comp(vs[0][0]);
	for(int i=0;i!=vs.size();++i)
	{
		if(vs[i][0]==comp)
		{
			++end;
			if(vs[i].size()<=1)
			{
				++start;
			}
			continue;
		}
		else
		{
			++ans;
			comp=vs[i][0];
			if(start>end)
			{
				start=i;
				end=i-1;
				--i;
				continue;
			}
			if(start==end)
			{
				start=i;
				end=i-1;
				--i;
				ans+=vs[start-1].size()-1;
				continue;
			}
			q.push(make(start,end+1,1));
			start=i;
			end=i-1;
			--i;
		}
	}
	++ans;
	if(start==end)
	{
		ans+=vs[start].size()-1;
	}
	else if(start<end)
	{
		q.push(make(start,end+1,1));//[min,max)
	}
	while(!q.empty())
	{
		node n;
		n=q.front();
		q.pop();
		//out<<n.start<<' '<<n.end-1<<endl;
		start=(n.start);
		end=(n.start-1);
		int depth(n.depth);
		comp=vs[start][depth];
		for(int i=start;i!=n.end;++i)
		{
			if(vs[i][depth]==comp)
			{
				++end;
				if(vs[i].size()<=depth+1)
				{
					++start;
				}
				continue;
			}
			else
			{
				++ans;
				comp=vs[i][depth];
				if(start>end)
				{
					start=i;
					end=i-1;
					--i;
					continue;
				}
				if(start==end)
				{
					start=i;
					end=i-1;
					--i;
					ans+=vs[start-1].size()-1-depth;
					continue;
				}
				q.push(make(start,end+1,depth+1));
				start=i;
				end=i-1;
				--i;
			}
		}
		++ans;
		if(start==end)
		{
			ans+=vs[start].size()-depth-1;
		}
		else if(start<end)
		{
			q.push(make(start,end+1,depth+1));//[min,max)
		}
	}
	return ;
}

void proc()
{
	if(vs.size()==1)
	{
		ans+=vs[0].size();
		return ;
	}
	stable_sort(vs.begin(),vs.end());
	/*for(itn i=0;i!=vs.size();++i)
	{
		out<<vs[i]<<endl;
	}*/
	bfs();
	return ;
}

void output()
{
	out<<ans<<endl;
	return ;
}