Assignment 10: String Algorithms
来源:互联网 发布:windows xp系统安装包 编辑:程序博客网 时间:2024/05/17 07:20
1936 All in All (1)
2408 Anagram Groups (2)
2359 Questions (3)
1750 Dictionary (3)
2752 Seek the Name, Seek the Fame (4)
1961 Period (5)
1147 Binary codes (6)
3261 Milk Patterns (6)
2185 Milking Grid (7)
3349 Snowflake Snow Snowflakes (7)
3167 Cow Patterns (8, challenge problem)
2774 Long Long Message (9, challenge problem)
poj2359
约瑟夫环
#include<cstring>#include<cstdio>#include<string>#include<iostream>using namespace std;string str,temp;int main(){ int n=1999,len,i,f; while(getline(cin,str)){ while(getline(cin,temp)){ str+=temp; } len=str.length(); f=0; for(i=2;i<=len;++i){ f=(f+n)%i; } if(str[f]=='?') printf("Yes\n"); else if(str[f]==' ') printf("No\n"); else printf("No comments\n"); } return 0;}
poj3261后缀数组+二分答案/栈找每个公共前缀的次数
#include <vector>#include <iostream>#include <string>#include <algorithm>#include <cstring>#include <cstdio>#include <stack>using namespace std;struct SuffixArray {const int L;vector<int> s;vector<vector<int> > P;vector<pair<pair<int,int>,int> > M;SuffixArray(const vector<int> &s) : L(s.size()), s(s), P(1, vector<int>(L, 0)), M(L) {for (int i = 0; i < L; i++) P[0][i] = int(s[i]);for (int skip = 1, level = 1; skip < L; skip *= 2, level++) {P.push_back(vector<int>(L, 0));for (int i = 0; i < L; i++)M[i] = make_pair(make_pair(P[level-1][i], i + skip < L ? P[level-1][i + skip] : -1000), i);sort(M.begin(), M.end());for (int i = 0; i < L; i++)P[level][M[i].second] = (i > 0 && M[i].first == M[i-1].first) ? P[level][M[i-1].second] : i;}}vector<int> GetSuffixArray() { return P.back(); }int LongestCommonPrefix(int i, int j) {int len = 0;if (i == j) return L - i;for (int k = P.size() - 1; k >= 0 && i < L && j < L; k--) {if (P[k][i] == P[k][j]) {i += 1 << k;j += 1 << k;len += 1 << k;}}return len;}};vector <int> a;stack <int> s;#define maxn 20005int cnt[maxn];int p[maxn],h[maxn];/*bool check(int a,int k,int n){int i,tot=0;for(i=0;i<n;++i){if(h[i]>=a) {if(++tot>=k) return 1;}else tot=0;}return 0;}*/int main() {//freopen("d.in","r",stdin);int n,k,i,x,ans=0,t;scanf("%d%d",&n,&k);for(i=0;i<n;++i) {scanf("%d",&x);a.push_back(x);}SuffixArray suffix(a);vector<int> v = suffix.GetSuffixArray();for(i=0;i<n;++i) p[v[i]]=i;// for(i=0;i<n;++i) printf("vi=%d pi=%d\n",v[i],p[i]);for(i=0;i<n-1;++i) h[i]=suffix.LongestCommonPrefix(p[i],p[i+1]);// for(i=0;i<n-1;++i) printf("hi=%d\n",h[i]);/*--k;int l,r,m;l=1;r=h[0];for(i=1;i<n-1;++i) r=max(r,h[i]);r++;while(l+1<r){m=(l+r)>>1;if(check(m,k,n-1)){l=m;}else{r=m;}}printf("%d\n",l);//二分高度,check宽度*/h[i]=0;for(i=0;i<n;++i){if(s.empty()){if(h[i]) {s.push(i);}}else if(h[s.top()]<=h[i]){s.push(i);}else{while(!s.empty() && h[s.top()]>h[i]){t=s.top();s.pop();cnt[t]=i-t;}if(h[i]) s.push(i);}}while(!s.empty()) s.pop();for(i=n-2;i>=0;--i){if(s.empty()){if(h[i]) {s.push(i);}}else if(h[s.top()]<=h[i]){s.push(i);}else{while(!s.empty() && h[s.top()]>h[i]){t=s.top();s.pop();if(t-i+cnt[t]>=k) ans=max(ans,h[t]);}if(h[i]) s.push(i);}}while(!s.empty() && h[s.top()]>0){t=s.top();s.pop();if(t-i+cnt[t]>=k) ans=max(ans,h[t]);}printf("%d\n",ans);//栈得到宽度return 0;}
poj3167变形KMP,当前面小于且小于等于的数个数(树状数组维护)都相等,相当于s[i]==s[j]。
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>using namespace std;#define maxk 25100#define maxn 100100#define maxs 30#define lowbit(x) (x&(-x))int a[maxn],b[maxk],c[maxs],e[maxk],l[maxk],ans[maxn],next[maxk];int n,k,s,tot;void add(int x,int d){ if(!x) return; while(x<=s){ c[x]+=d; x+=lowbit(x); }}int sum(int x){ int ans=0; while(x>0){ ans+=c[x]; x-=lowbit(x); } return ans;}void gaonext(){ int i,j,p; next[0]=-1; for(i=0,j=-1;i<k;){ if(j==-1 || (l[j]==sum(b[i]-1) && e[j]==sum(b[i]))){ ++i,++j; add(b[i],1); next[i]=j; }else{ for(p=i-j;p<i-next[j];++p) add(b[p],-1); j=next[j]; } }}void kmp(){ int i,j,p; add(a[0],1); for(i=0,j=0;i<n;){ if(l[j]==sum(a[i]-1) && e[j]==sum(a[i])){ ++i,++j; add(a[i],1); if(j==k){ ans[tot++]=i-k; for(p=i-j;p<i-next[j];++p) add(a[p],-1); j=next[j]; } }else{ for(p=i-j;p<i-next[j];++p) add(a[p],-1); j=next[j]; } }}int main(){ int i; scanf("%d%d%d",&n,&k,&s); for(i=0;i<n;++i) scanf("%d",&a[i]); for(i=0;i<k;++i){ scanf("%d",&b[i]); add(b[i],1); e[i]=sum(b[i]); l[i]=sum(b[i]-1); // printf("i=%d ei=%d li=%d\n",i,e[i],l[i]); } memset(c,0,sizeof(c)); gaonext(); // for(i=0;i<=k;++i) printf("i=%d nei=%d\n",i,next[i]); memset(c,0,sizeof(c)); kmp(); printf("%d\n",tot); for(i=0;i<tot;++i) printf("%d\n",ans[i]+1); return 0;}
- Assignment 10: String Algorithms
- Assignment 6: Basic Graph Algorithms
- Assignment 7: Shortest Path Algorithms
- Week1 Assignment - Princeton-Algorithms-PartI
- Week2 Assignment - Princeton-Algorithms-PartI
- Week3 Assignment - Princeton-Algorithms-PartI
- Week 5 Assignment - Princeton-Algorithms-PartI
- Coursera Algorithms Programming Assignment 1: Percolation
- 【索引】String Algorithms
- 【索引】String Algorithms::Examples
- Boost String Algorithms Library
- Leetcode-Algorithms Reverse String
- Assignment 10
- Week4 Assignment - Without Full Score - Princeton-Algorithms-PartI
- Week 1 Assignment - Wordnet - Princeton - Algorithms Part II
- Algorithms: Design and Analysis, Part 1, Programming Assignment #5
- Coursera Algorithms Programming Assignment 2: Deque and Randomized Queue
- Introduction to String Searching Algorithms
- uva 10047 The Monocycle(BFS+状态判重)
- ORACLE里的锁
- HDU 1372 BFS
- 关于CI中的CURD
- ffmpeg开发指南
- Assignment 10: String Algorithms
- DenyHosts保护你的linux server
- FFMPEG源码分析(二)
- Hdu 4452 Running Rabbits 大模拟
- FFMPEG源码分析(1)--持续更新
- Guava学习笔记:EventBus
- 从0开始学习quantum之3:实现WSGI的第三方库
- xcode4以後rootviewcontroller的變化
- VC6.0的兼容性问题解决方案