一直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;
}
代码