2019年7月31日训练日记(字符串,Tire)

今天晚上依旧是按时打了比赛,比较尴尬的是A题一道特别水的题我竟然读错了题,开始觉得只要数字和下标不对应就是正确的,结果就WA了,后来才知道奇数是-1,偶数个是奇数位和偶数位交换。
B题是道数学题,按理来说把公式推出来就应该不难,但是,我做出来本地AC之后一提交就WA,明明样例都过了,一交就WA,还WA在第二组样例。改了好几遍才改出来,好像是因为有些条件判断的不太准确。具体我也不知道错哪了,样例本地过了,输出的数值也对,但还是WA在样例上。
C题读了一个多小时没读懂,后来才知道是邻接矩阵问题。

白天主要是看了字符串和Tire。
字符串主要是有KMP算法和字符穿的最小表示法。KMP算法主要用于判定字串,通过自我匹配的预处理,降低与字符串遍历匹配的时间复杂度。最小表示法是从字符串末尾取字符放到字符串最前面,的最小情况。使用新串和老串比较,在前面都相同的情况下,选择第k位最小的进行比较,跳转到k的位置继续比较。
最小表示法:
1.初始化i=1,j=2;
2.比较两个以i和j为首的字符串
若扫描了n个全部相等,则只有一种字符组成,任选都为最小;
若在第i+kj+k位置不相等:
ss[i+k]>ss[j+k],则令i=i+k+1。若此时i=j,再令i=i+1;
ss[i+k]<ss[j+k],则令j=j+k+1。若此时i=j,再令j=j+1
Tire是字典树,用于实现字符串的快速检索。
模板

int tire[SIZE][26],tot=1;//初始化,假设字符串由小写字符串组成
void insert(char* str)
{
    //插入一个字符串
    int len=strlen(str),p=1;
    for(int k=0; k<len; k++)
    {
        int ch=str[k]-'a';
        if(tire[p][ch]==0)
            tire[p][ch]=++tot;
        p=tire[p][ch];
    }
    endd[p]=true;
}
bool searchh(char* str)
{
    int len=strlen(str),p=1;
    for(int k=0; k<len; k++)
    {
        p=tire[p][str[k]-'a'];
        if(p==0)
            return false;
    }
    return endd[p];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值