首页 > 代码库 > 喵喵的IDE
喵喵的IDE
喵喵的IDE
Time Limit: 20000/10000MS (Java/Others)Memory Limit: 512000/256000KB (Java/Others)
SubmitStatisticNext Problem
Problem Description
喵喵有一个神奇的IDE,这个IDE自带一个cache,还有一个当前编辑区editarea,初始的时候这个 cache 中有一个字符串 cachebegin。
喵喵想打按照顺序打N个字符串 x,她可以进行三种操作。
打之前 editarea 为空
1、从cache中拿出一个字符串 B直接赋值给editarea , editarea = B.(如果不拿那么不计入操作数)
2、如果editarea里面有字符,那wuyiqi可以删除掉editarea中最后一个字符。(删光了之后就不能删除啦!)
3、喵喵可以在editarea末尾插入一个任意字符。
如果editarea的字符串恰好与她要打的第i个字符串相同,那么她就完成了这次打印,并且这个字符串自动加入cache(cache中可能出现重复字符串),然后editarea自动清空。那么喵喵就会自动进入下一个字符串的打印阶段。
她想问,对于每次字符串输出,最少需要多少次操作。
1 ≤ N ≤ 105 , 字符串长度总和 ∑(Ai) <106 , cache_begin 长度< 100
Input
第一行一个整数T,代表数据组数。
对于每组数据第一行一个整数 N 代表要打印的字符串个数,还有一个字符串cachebegin
以下N 行每行一个字符串 Ai
Ai 和 cachebegin 都只包含小写字母
Output
对于每组测试数据输出N个数。
Sample Input
13 aaababc
Sample Output
122
Hint
字典树
#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <math.h>using namespace std;#define N 1000005#define INF 0x3f3f3f3f#define LL long longint ch[N][27],val[N];char s[1005];int sz = 1;int InsertT(char s[]){ int i,u = 0,c,len,ans; len = strlen(s); ans = len;//最小初始为自己长度 for(i = 0 ; i < len ; i++) { c = s[i] - ‘a‘; if(!ch[u][c]){ memset(ch[sz],0,sizeof(ch[sz])); val[sz] = INF; ch[u][c] = sz++; } u = ch[u][c]; ans = min(ans,len-i-1+val[u]+1);//字符串长度-所走过的路+节点到叶子的长度 val[u] = min(val[u],len - i-1);//节点到叶子节点的最小值 } return ans;}int main(){ int n,m,t; scanf("%d",&t); while(t--) { memset(ch[0],0,sizeof(ch[0])); sz = 1; scanf("%d %s",&n,s); InsertT(s); while(n--) { scanf("%s",s); int ans = 0; ans = InsertT(s); printf("%d\n",ans); } } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。