首页 > 代码库 > 喵喵的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;}