讨厌的新系统

Problem Description
前几天,“较硬”公司推出了新的操作系统Swodniw vista。于是,小恒便高高兴兴地将它买了回来,并给自己的计算机装上了。结果他却发现许多软件和程序的运行速度都慢了很多,和以前的操作系统相比,简直是天壤之别。后来小恒发现,原来是新系统的UAC保护模式在作怪。
UAC保护模式其实是一个用户权限检测系统。每当用户执行一条操作,UAC都会花上若干时间来检测合法性。UAC将检测分成了N个模块,每个模块的执行顺序严格按照一个有向树拓扑有序
A(ABCDEF, 1)----> B(ABC, 3)---->E(BC, 2)
A(ABCDEF, 1)----> C(DEF, 1))---->F(D, 1)
A(ABCDEF, 1)----> D(AEF, 4)
一个模块包含两个属性,匹配串S和检测时间C。现在,对一个操作串T,当一个模块的S包含了T中的若干个字符,则必须执行该模块。要注意,各个模块是可以同时执行的。
比如,对操作序列“BE”,则执行了A、B、C、D、E五个模块,最少花费时间为6(1+3+2)。
现在给出M个操作串,那么UAC完成每个串的检测最少需要多少时间呢?
Input
输入有多组数据,对于每组数据第1行为两个整数N和M(N<=2007,M<=100000),N表示检测个数,M表示操作串个数
接下来N行,每行包含非负整数F,C(C<=1000)和一个字符串S(长度<=100),分别表示前继模块的序号,检测时间和匹配串。模块由1和N编号,根的前继为0。
再下来M行,每行只有一个字符串(长度<=100),表示需要检测的字符串。
字符串中不包括空格、换行符和所有的控制字符。
Output
对于每组数据输出M行,每行包含一个整数,表示最少的检测时间。
Sample Input
6 2
0 1 ABCDEF
1 3 ABC
2 2 BC
1 1 DEF
4 1 D
1 4 AEF
BE
AA
3 2
0 0 0
1 1 1
2 2 0
0
1
Sample Output
6
5
3

1

//用dfs()算出每个节点到跟节点所用的最长时间,然后当前节点所包含的串的每一个字符的时间为该节点到根节点的最长时间

#include<stdio.h>
#include<string.h>
#define maxn 2010
#define maxlen 110
int times[maxn],last[maxn],total_times[140],n,m;
char ys[maxn][maxlen],ms[maxlen];
void dfs(int root)
{
	int i;
	for(i=1;i<=n;i++)
		if(last[i]==root)
		{
			times[i]+=times[root];
			dfs(i);
		}
}
int main()
{
	//freopen("b.txt","r",stdin);
	while(scanf("%d %d",&n,&m)==2)
	{
		int i,j,root;
		for(i=1;i<=n;i++)
		{
			scanf("%d %d",&last[i],×[i]);
			if(last[i]==0)
				root=i;
			//scanf("%s",ys[i]);
			gets(ys[i]);
		}
		dfs(root);
		memset(total_times,0,sizeof(total_times));
		for(i=1;i<=n;i++)
			for(j=0;ys[i][j];j++)
				if(total_times[ys[i][j]]<times[i])
					total_times[ys[i][j]]=times[i];
		for(i=0;i<m;i++)
		{
			//scanf("%s",ms);
			gets(ms);
			int ans=0;
			for(j=0;ms[j];j++)
				if(ans<total_times[ms[j]])
					ans=total_times[ms[j]];
				printf("%d\n",ans);
		}

	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值