喵喵的IDE
Time Limit: 20000/10000MS (Java/Others)Memory Limit: 512000/256000KB (Java/Others)
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
1 3 a a ab abc
Sample Output
1 2 2
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 long int 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 ",ans); } } return 0; }