喵喵的IDE

喵喵的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\n",ans);
        }
    }
    return 0;
}
posted @ 2014-07-16 20:27  SprayT  阅读(159)  评论(0编辑  收藏  举报