字典树(背单词,LA 3942)

一直WA,找不到错,十分烦躁。

事实上是模板写错了,int ch[][]写成了char ch[][],直接爆炸。

说明看了一遍代码后再自己写一遍是绝对不会动脑子的,不仅不理解,还以为自己懂了。

所以说写代码这种东西,只有自己创造出来的才不会忘,以后再写也才不会错。一旦沾上任何一点背默的成分,就跟不会一个样。

模板还是要的,毕竟你需要在比赛中快速的打出一份正确的代码。

但是平时的练习中,尽量都自己实现,除非说真的不会,那就要看一下学一下,然后再自己写一下,但是在今后的练习中要尽量自己写出来,哪怕觉得快忘了,也要尽量只靠自己想出来。这样才能真正的提高。当然,自己写的话有bug在所难免,可能会浪费掉非常多时间,但是这些时间是值得的,因为你在思考,而且发现了自己不懂的地方。


虽然刚才我烦躁得想砸电脑= =。


但最终AC的快感还是很不错的。


一点题外话

依稀记得三个月前的某个下午,自己在机房写代码,刚好遇到了傅神,便一起度过了一个愉快的下午。当时他正在做这道题,所以跟我讨论了一下,刚好我半年前在cf做过一道题,思路很类似,给他看了看,感觉应该有帮到他。自己已经很久没有跟傅神一起写代码了,也就刚开学那段时间经常一起。后来也不知道为什么就不常见面了。傅神是我目前为止在大学里最敬佩的人,今后也应该会是。自己跟他的差距真的很大,很多时候自己讶异于他的代码速度和AC率,觉得他好有天赋,为什么什么都做得那么快,事实上自己只是看到了别人成功的喜悦,却没看到别人背后默默的付出。自己跟他比起来真的付出的太少,甚至感觉自己差他几个月的水平。不问收获,但问付出,默默努力,别老想着投机取巧与贪心,机会就会出现。


代码

#include<bits/stdc++.h>
#define maxnode 400010
#define maxsize 26
#define mod 20071027
using namespace std;

//struct Trie
//{
    int ch[maxnode][maxsize];
    int val[maxnode],sz;
//    Trie()
//    {
//        memset(ch[0],0,sizeof(ch[0]));
//        val[0]=0;
//        sz=1;
//    }
    int idx(char x)
    {
        return x-'a';
    }
    void INSERT(char* s,int v)
    {
        int l=strlen(s);
        int u=0;
        for(int i=0;i<l;i++)
        {
            int id=idx(s[i]);
            if(!ch[u][id])
            {
                memset(ch[sz],0,sizeof(ch[sz]));
                val[sz]=0;
                ch[u][id]=sz++;
            }
            u=ch[u][id];
        }
        val[u]=v;
    }
    int next(int u,char c)
    {
        int id=idx(c);
        if(ch[u][id]) return ch[u][id];
        else return -1;
    }
//};

char str[300010];
char s[110];
int dp[300010];
int n;
int kase;

int main()
{
    while(~scanf("%s",str))
    {
        memset(ch[0],0,sizeof(ch[0]));
        val[0]=0;
        sz=1;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%s",s);
            int l=strlen(s);
            for(int i=0;i<l/2;i++)
                swap(s[i],s[l-i-1]);
            INSERT(s,1);
        }
        memset(dp,0,sizeof(dp));
        int l=strlen(str);
        for(int i=0;i<l;i++)
        {
            int u=0;
            for(int j=i;j>=0;j--)
            {
                u=next(u,str[j]);
                if(u==-1) break;
                if(!val[u]) continue;
                if(j) dp[i]=(dp[i]+dp[j-1])%mod;
                else dp[i]=(dp[i]+1)%mod;
            }
        }
        printf("Case %d: %d\n",++kase,dp[l-1]);
    }
    return 0;
}




代码


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值