-
1936 All in All (1)
-
2359 Questions (3)
-
1750 Dictionary (3)
-
1961 Period (5)
-
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 20005 int 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
最新推荐文章于 2021-12-11 23:42:36 发布