zoukankan      html  css  js  c++  java
  • 喵喵的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
    ",ans);
            }
        }
        return 0;
    }
  • 相关阅读:
    JEECG与帆软报表集成
    各种数据库的锁表和解锁操作
    sql server数据库查询超时报错
    java项目部署后的文件路径获取
    js解决跨站点脚本编制问题
    java递归算法实现拼装树形JSON数据
    FreeMarker中的list集合前后台代码
    去除list集合中重复项的几种方法
    Java中Properties类的操作
    mysql 容灾 灾备 备份
  • 原文地址:https://www.cnblogs.com/llei1573/p/3849521.html
Copyright © 2011-2022 走看看