随笔分类 - 字符串
摘要:zoj 3611同类型的题目poj 2688化简模型即可得这样的问题,一幅图给定起点 终点 ,求起点到终点最多经过几个点,如果两种方案经过的点数相同,选路径总长短的注意,这幅图最多只有12个点,所以立刻可以想到用状态压缩来做dp[i][j]表示以i为终点的路径 为j状态(经过了那些点)时的最短路径ps:在预处理最短路的时候不要将'$'算进去,就看成一个普通的可以走的格子就可以了因为可能会出现如下情况,'$'的费用会算了四次,所以还是先数一下有几个'$'然后再独立算吧View Code #include<cstdio>#include&
        阅读全文
            
摘要:转自:http://bbs.dlut.edu.cn/bbstcon.php?board=Competition&gid=23474 其实原文说得是比较清楚的,只是英文的,我这里写一份中文的吧。 首先:大家都知道什么叫回文串吧,这个算法要解决的就是一个字符串中最长的回文子串有多长。这个算法可以在O(n)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文有多长, 这个算法有一个很巧妙的地方,它把奇数的回文串和偶数的回文串统一起来考虑了。这一点一直是在做回文串问题中时比较烦的地方。这个算法还有一个很好的地方就是充分利用了字符匹配的特殊性,避免了大量不必要的重复匹配。 算法
        阅读全文
            
摘要:转自 http://roba.rushcj.com/?p=439定义k-回文串如下:(1)任何串(包括空串)都是0-回文; (2)一个长度为n的回文串,若它的前n/2个字符和后n/2个字符都是(k-1)-回文,则它是k-回文。现给定一个串(长度不超过5,000,000),设它的每个前缀分别是x-回文,求所有这些x值的和。比如abacaba,”a”是1-回文,”aba”是2-回文,”abacaba”是3-回文,故输出6。将字符串 反转接在后面,然后KMP求解即可 把原串翻转后拼接在原来的串后面,用一个不在字母表中的分隔符隔开的。然后用KMP里对模式串的预处理那个过程,求出失配以后往前跳的那个指针
        阅读全文
            
摘要:ps:D题挂了,最后只有三个。。。。E题是赛后看着一群大神的代码YY的(网上找不到题解,好奇怪,肿么都没人写的)之所以这么迟是因为一直在纠结E题A:如果第一个人能放,那就放在中间的位置,然后第二个人不管放哪第一个人总有对称的放法B:水题C:简单贪心,错了一次D:给你一幅图,假如在地板上铺上无限的同样的图,判断从S出发能否走到无限远的地方只需要判断能否从一幅图的一个点走到相对位置相同的另一幅图中的那个点即可,通过取余来表示无限幅地图E:给你一棵树,然后又给你坐标图上的n个点,让你按照树的构成将坐标连接起来,即给所有的坐标点一个编号,将树种的点与坐标对应起来树中相交的边 在坐标中体现 的线段也相交
        阅读全文
            
摘要:对KMP的熟练使用View Code 我的代码 kmp匹配过去,需要熟练掌握KMP,数据范围大一点也没关系#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 100010;int n,mb,mc;char a[maxn],b[maxn],c[maxn];int p1[maxn],p2[maxn];void getp(int p[],int m,char b[]){ p[1]=0; int i,j=0; for(i=2;i<=m;
        阅读全文
            
摘要:http://www.lightoj.com/volume_showproblem.php?problem=14271427 - Substring Frequency (II)PDF (English)StatisticsForumTime Limit:5 second(s)Memory Limit:128 MBA string is a finite sequence of symbols that are chosen from an alphabet. In this problem you are given a stringTandnqueries each with a stri
        阅读全文
            
摘要:给你一个主串再给你很多模式串对于每个串分别判断它在主串中出现了几次每个模式串还有一个flag标记 0:匹配的时候可以重叠 1:匹配的时候不能重叠在匹配的时候判断当期节点上一次匹配的时候在主串中的位置与当前位置之差是否大于模式串的长度即可View Code #include<cstdio>#include<cstring>const int MM = 500005,NC = 26;int N;char str[100010];char s[100010];int x[100010];int flag[100010];struct trie{ int ch[NC],fail
        阅读全文
            
摘要:先是论文中的一个模板View Code /*后缀数组模板rank[0~n-1] : 值域: 1~nsa[1~n] ; 值域: 0~n-1height[2~n]: suffix[i-1]与suffix[i]的最长公共前缀suffix(i-1) 与 suffix(i)是排名相邻的两个后缀height[1]无意义*/#include<cstdio>#include<cstring>#include<set>using namespace std;const int maxn = 400010;int rank[maxn],sa[maxn],height[maxn]
        阅读全文
            
摘要:http://www.codeforces.com/problemset/problem/182/D求两个字符串的公约数的个数,具体细节见题目利用KMP可以求最小周期的特性来解这道题具体证明参见我的另一篇文章所以第一步:KMP求出两个串的最小周期 t1 t2第二步:分情况讨论1: t1==n&&t2==m2: t1==n t2!=m3: t1!=n t2==m4: t1!=n&&t2!=mView Code #include<cstdio>#include<cstring>int n,m;char a[100100],b[100100];
        阅读全文
            
摘要:先mark,题目刷的差不多再说View Code #include<cstdio>#include<cstring>#define FF(i,to) for(i=0;i<to;i++)const int MM = 1000005,NC = 26;int N;char str[1000005];struct trie{ int ch[NC],fail,f,val; void init(){ memset(ch,0,sizeof(ch)); fail=f=val=0; }}a[MM];int cnt,rt,q[MM],front,last;void I...
        阅读全文
            
摘要:可以练练代码能力写了个字典树映射,字典树节点中还用一个vector保存了拥有相同构成的字符串,输出时排序一下输出就好了细节处理需要细心View Code #include<cstdio>#include<vector>#include<cstring>#include<iostream>#include<string>#include<map>#include<algorithm>using namespace std;char str[30010][20];class trie{public : int nu
        阅读全文
            
摘要:其实也算不上模板,代码很简单http://acmpj.zstu.edu.cn/JudgeOnline/showproblem?problem_id=1086上面这题可以理解什么是最小表示法方法在这里http://www.cnblogs.com/ACAC/archive/2010/05/23/1742349.html字符串最小表示求字符串的循环最小表示:上面说的两个字符串同构的,并没有直接先求出Min(s),而是通过指针移动,当某次匹配串长时,那个位置就是Min(s)。而这里的问题就是:不是给定两个串,而是给出一个串,求它的Min(s),eg:Min(“babba”) = 4。那么由于这里并非要
        阅读全文
            
摘要:A了3个多串匹配的水题模板View Code #include<cstdio>#include<cstring>#include<queue>using namespace std;const int maxn = 1000010;struct Tire{ int flag,fail; int next[26]; void init() { flag=0;fail=-1; for(int i=0;i<26;i++) next[i]=0; }}tb[maxn];int tot;char str[maxn];void insert(char...
        阅读全文
            
摘要:中等的模拟题,各种暴力枚举可以用来锻炼代码能力View Code #include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct DD{ char s[25];}dic[120];int cmp(DD a,DD b){ return strcmp(a.s,b.s)<0;}char query[100];char ss[100][100];bool judge(char *query,char *dic){ char unsign[100]; char pos[
        阅读全文
            
摘要:字典树没有清空wrong了一次假设最后所有的字符都要删除,则每个字符至少被删除一次,被打进一次,还有n次的打印现在最后可以剩下一个字符串,则应该剩下最长的那串,可以减少最多的删除操作View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;char s[55];int ans;class trie{public : trie* child[27]; trie() { memset(child,0,sizeof(child)); }}root;voi.
        阅读全文
            
摘要:http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.htmlpoj 2406 简单求周期View Code #include<cstdio>#include<cstring>char b[1000010];int p[1000010];int m,n;void getp(){ p[1]=0; int i,j=0; for(i=2;i<=m;i++){ while(j>0&&b[j+1]!=b[i]) j=p[j]; if(b[j+1]==b[i]) j+=1; p[i]=j...
        阅读全文
            
摘要:----------------------------------------------k m x j i由上,next【i】=j,两段红色的字符串相等(两个字符串完全相等),s[k....j]==s[m....i]设s[x...j]=s[j....i](xj=ji)则可得,以下简写字符串表达方式kj=kx+xj;mi=mj+ji;因为xj=ji,所以kx=mj,如下图所示------------- -------------k m x j 看到了没,此时又重复上面的模型了,kx=mj,所以可以一直这样递推下去所以可以推出一个重要的性质len-next[i]...
        阅读全文
            
摘要:首先看我对kmp解决周期、前缀与后缀间关系的解释http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.htmlhdu 3336 count the string题意:求给定字符串含前缀的数量abab前缀为aababaabababab中共有六个子串是前缀a a ab ab aba abab所以答案为6利用kmp中的匹配原理可以完美的解决此题a---------d----- -----a---------d i j如上所示,假设两串字符完全相等,next[j]=i,代表s[1...i]==sum[j-i+1....j]...
        阅读全文
            
摘要:View Code #include<cstdio>#include<cstring>int n,m;int a[1000010],b[10010];int p[11111];void getp(){ p[1]=0; int i,j=0; for(i=2;i<=m;i++){ while(j>0&&b[j+1]!=b[i]) j=p[j]; if(b[j+1]==b[i]) j+=1; p[i]=j; }}int kmp(){ int i,j=0,cnt=0; for(i=1;i<=n;i++){ wh...
        阅读全文
            
摘要:核心思想:当某个字符失配时,尽可能多的向右滑动而又不影响结果。具体见http://www.matrix67.com/blog/archives/115/View Code #include<cstdio>#include<cstring>int n,m;char a[1000],b[1000];int p[1000];void getp(){ p[1]=0; int i,j=0; for(i=2;i<=m;i++){ while(j>0&&b[j+1]!=b[i]) j=p[j]; if(b[j+1]==b[i]) j+=1; p[i...
        阅读全文
            
 
                    
                
 
 浙公网安备 33010602011771号
浙公网安备 33010602011771号