随笔分类 - Acm
摘要:#include#include#define maxn 10010char s[maxn];int getmin(){ int i,j,k,len=strlen(s); i=0; j=1; k=0; while(i0) i+=k+1; ...
阅读全文
摘要:#include#include#define maxn 1000010int next[maxn],s[maxn],p[maxn];int n,m;void getnext(){ int j,k; k=-1; j=0; next[0]=-1; while(j<m) ...
阅读全文
摘要:这题要求的是字符串左移时字典序最小和最大的第几次出现,并求出现次数。考虑一会可以发现,出现次数和循环节是有关系的。出现了几次,就是循环了几次,如果循环节是他本身,也就是无循环,那这个字符串不管怎么移,都只有一种情况。关键就是求第几次出现,也就是最大最小的表示。顺便学习了一下。#include#inc...
阅读全文
摘要:http://wenku.baidu.com/link?url=1hkGv3wY1CFD17E5RsyfFUCSPBmEJHfyaJZHLXIPnp1wHG54OyMGgLhVCwdt7YuEGENhnGyH7AJeC85giBGXrZg6dW6fdIU2-n7jQiLY9XG循环字符串的最小表示法...
阅读全文
摘要:这题琢磨了挺长的时间。需要理解next[]表示了什么;next[i]代表了前缀和后缀的最大匹配的值,也就是个数。len-next[len]表示循环节的长度;比如abcab int fl=len-next[len]=3;循环节长度为3,即cab。然后int len=strlen(s)=5;如果len...
阅读全文
摘要:2个字符长合并在一起即可。要注意next[n]的值要小于初始的两个字符串的长度;//next[]存的是之前相同的长度。//也是位置,只是s[i]不一定和s[next[i]]相同 //但是i之前的和next[i]之前相同的个数==next[i];#include#include#define maxn...
阅读全文
摘要:稀里糊涂1A开心。我做了2次kmp,先第一次利用next[],由于next[]前面一小段一直是一样的,所以可以根据这个来找。然后就找到了开头和结尾,还缺中间的部分。中间的部分就是通过开头部分去模式匹配,如果有就直接输出,break就可以。(因为开始长度最长)#include#include#defi...
阅读全文
摘要:求循环节。#include#include#define maxn 1000010int next[maxn];char s[maxn];void getnext(){ int j,k,len=strlen(s); j=0; k=-1; next[0]=-1; whil...
阅读全文
摘要:需要理解next[]的意义。之前看到大牛的博客,next[]讲的非常清楚。利用next[],当前位子的前面那一段和next[当前位子]的前面那一段是相同的。又next[next[当前位子]]与next[当前位子]有一段相同,所以当前位子的前面一段和next[next[当前位子]]的前一段有相同即可。...
阅读全文
摘要:Cellphone TypingTime Limit:5000msMemory Limit:131072KBThis problem will be judged on UVA. Original ID:1252664-bit integer IO format:%lld Java class na...
阅读全文
摘要:简单KMP 求单词出现的次数。直接可以考虑,在每一次匹配成功时,让ans++,k=next[k],直到结束。#include#include#define maxn 1000010#define ll 100010int next[ll];char s[maxn],p[ll];void getnex...
阅读全文
摘要:kmp简单题 找循环节。由于KMP的next[]数组,所以可以考虑最后一组的情况,及next[n]的值;n-next[n]的值表示一个循环节。如果n%(n-next[n])!=0表明该循环不成立。不然就是直接得到。#include#include#define maxn 1000010int nex...
阅读全文
摘要:大牛的好文 http://www.cnblogs.com/tangzhengyue/p/4315393.html下图摘自链接大牛的博客1.由"next[j] == k;"这个条件,我们可以得到A1子串 == A2子串(根据next数组的定义,前后缀那个)。2.由"next[k] == 绿色色块所在的...
阅读全文
摘要:#include#include#includeusing namespace std;#define lson l,m,rt0) sum[rt]=1; else sum[rt]=-1; return ; } int m=(l+r)/2;...
阅读全文
摘要:题目简化后最终要求的就是第二大的数。但是由于数据较大,不能直接求。可以先预处理,求出所有情况。#include#include#includeusing namespace std;struct node{ int from; int to;};struct Node{ int m...
阅读全文
摘要:字典树是一个比较简单的数据结构。它利用字符串的公共前缀来节约存储空间。并且效率不错;简单的说,就是多个字符串。如果前缀相同,就把他的前缀放在一条路上,用一个变量记录出现的个数。题目基本就是求给一堆字符串,再给一个字符串,问有多少出现过;基本相同原理,可以适当修改trie结构体里的内容,来达到要求;
阅读全文
摘要:要注意二点 。这组数据16shehehesayshrheryasherhs出现重复的,也要算。所以这里答案为4;这一组16shehehesayshrheryasherhe查询单词中he出现过,所以后面的he不能记录,所以答案为4;#include#include#includestruct trie...
阅读全文
摘要:开始以为枚举会超时,因为有50000的词。后来试了一发就过了。哈哈。枚举没一个单词,将单词拆为2半,如果2半都出现过,那就是要求的。#include#include#includestruct trie{ trie *next[26]; int flag;};trie *root;voi...
阅读全文

浙公网安备 33010602011771号