2017 ACM/ICPC Asia Regional Shenyang Online
2017-09-11 01:18
465 查看
A string string string
判断一个字符串恰出现k次的子串个数。建立SAM,对每个节点统计出现次数cnti,先对字符串的n个后缀的cnti+=1,然后将每个节点的值更新父节点。
#include<bits/stdc++.h> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define ForkD(i,k,n) for(int i=n;i>=k;i--) #define Rep(i,n) for(int i=0;i<n;i++) #define ForD(i,n) for(int i=n;i;i--) #define RepD(i,n) for(int i=n;i>=0;i--) #define Forp(x) for(int p=pre[x];p;p=next[p]) #define Forpiter(x) for(int &p=iter[x];p;p=next[p]) #define Lson (o<<1) #define Rson ((o<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define MEMI(a) memset(a,0x3f,sizeof(a)); #define MEMi(a) memset(a,128,sizeof(a)); #define MEMx(a,b) memset(a,b,sizeof(a)); #define INF (0x3f3f3f3f) #define F (1000000007) #define pb push_back #define mp make_pair #define fi first #define se second #define vi vector<int> #define pi pair<int,int> #define SI(a) ((a).size()) #define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans); #define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a <<endl; #define PRi2D(a,n,m) For(i,n) { \ For(j,m-1) cout<<a[i][j]<<' ';\ cout<<a[i][m]<<endl; \ } #pragma comment(linker, "/STACK:102400000,102400000") #define ALL(x) (x).begin(),(x).end() #define gmax(a,b) a=max(a,b); #define gmin(a,b) a=min(a,b); typedef long long ll; typedef long double ld; typedef unsigned long long ull; ll mul(ll a,ll b){return (a*b)%F;} ll add(ll a,ll b){return (a+b)%F;} ll sub(ll a,ll b){return ((a-b)%F+F)%F;} void upd(ll &a,ll b){a=(a%F+b%F)%F;} inline int read() { int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f; } #define MAXN (200100) #define Sigmasize (26) class SAM { public: char s[MAXN]; int n; void mem(char *_s){ n=strlen(_s); memcpy(s,_s,sizeof(char)*(n+5)); Rep(i,2*n+10) { Rep(j,26) son[i][j]=0; pre[i]=step[i]=0; } last=tot=0; } int son[MAXN][Sigmasize+1],pre[MAXN],step[MAXN],last,tot; int cnt[MAXN]; void extend(char ch) { step[++tot]=step[last]+1; int p=last,np=tot; for(;!son[p][ch];p=pre[p]) son[p][ch]=np; if (!p) pre[np]=1; else { int q=son[p][ch]; if (step[q]==step[p]+1) pre[np]=q; else { step[++tot]=step[p]+1; int nq=tot; memcpy(son[nq],son[q],sizeof(son[q])); pre[nq]=pre[q]; pre[q]=pre[np]=nq; for(;son[p][ch]==q;p=pre[p]) son[p][ch]=nq; } } last=np; cnt[last]++; } void build(){ Rep(i,2*n+10) cnt[i]=0; last=tot=1; Rep(i,n) extend(s[i]-'a'); } int c[MAXN],q[MAXN],len[MAXN]; void calc(int k) { Rep(i,2*n+10) c[i]=0; For(i,tot) c[step[i]]++; For(i,tot) c[i]+=c[i-1]; For(i,tot) q[c[step[i]]--]=i; int p=1; ll ans=0; ForD(i,tot) { int u=q[i]; if (pre[u]>0) cnt[pre[u]]+=cnt[u]; if (cnt[u]==k) { ans+=step[u]-step[pre[u]]; } } printf("%lld\n",ans); } }S; char s[MAXN]; int main() { // freopen("A.in","r",stdin); // freopen(".out","w",stdout); int T;T=read(); while(T--) { int k=read(); scanf("%s",s); S.mem(s); S.build(); S.calc(k); } return 0; }
D array array array
求一个序列删除k个元素后是否能单调递增或递减。签到
#include<bits/stdc++.h> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define ForkD(i,k,n) for(int i=n;i>=k;i--) #define Rep(i,n) for(int i=0;i<n;i++) #define ForD(i,n) for(int i=n;i;i--) #define RepD(i,n) for(int i=n;i>=0;i--) #define Forp(x) for(int p=pre[x];p;p=next[p]) #define Forpiter(x) for(int &p=iter[x];p;p=next[p]) #define Lson (o<<1) #define Rson ((o<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define MEMI(a) memset(a,0x3f,sizeof(a)); #define MEMi(a) memset(a,128,sizeof(a)); #define MEMx(a,b) memset(a,b,sizeof(a)); #define INF (0x3f3f3f3f) #define F (1000000007) #define pb push_back #define mp make_pair #define fi first #define se second #define vi vector<int> #define pi pair<int,int> #define SI(a) ((a).size()) #define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans); #define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a <<endl; #define PRi2D(a,n,m) For(i,n) { \ For(j,m-1) cout<<a[i][j]<<' ';\ cout<<a[i][m]<<endl; \ } #pragma comment(linker, "/STACK:102400000,102400000") #define ALL(x) (x).begin(),(x).end() #define gmax(a,b) a=max(a,b); #define gmin(a,b) a=min(a,b); typedef long long ll; typedef long double ld; typedef unsigned long long ull; ll mul(ll a,ll b){return (a*b)%F;} ll add(ll a,ll b){return (a+b)%F;} ll sub(ll a,ll b){return ((a-b)%F+F)%F;} void upd(ll &a,ll b){a=(a%F+b%F)%F;} inline int read() { int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f; } #define MAXN (100100) int n,m,a[MAXN],d[MAXN],f[MAXN],len=0; void LIS() { MEM(f) memset(d,128,sizeof(d)); d[len=0]=INF; ForD(i,n) { int l=0,r=len,ans=0; while (l<=r) { int m=l+r>>1; if (a[i]<=d[m]) ans=m,l=m+1; else r=m-1; } f[i]=ans+1;len=max(len,f[i]); d[f[i]]=max(d[f[i]],a[i]); } } int main() { // freopen("D.in","r",stdin); // freopen(".out","w",stdout); int T=read(); while(T--) { n=read();int k=read(); For(i,n) a[i]=read(); LIS(); int p=len; For(i,n/2) swap(a[i],a[n-i+1]); LIS(); int p2=len; if(n-k<=p||n-k<=p2) { printf("A is a magic array.\n"); }else puts("A is not a magic array."); } return 0; }
mustedge mustedge mustedge
还在MLE相关文章推荐
- Problem 1002-2017 ACM/ICPC Asia Regional Shenyang Online
- 2017 ACM/ICPC Asia Regional Shenyang Online 1004 & hdu6197:array array array
- HDU 6199 gems gems gems (DP, 2017 ACM/ICPC Asia Regional Shenyang Online)
- 2017 ACM/ICPC Asia Regional Shenyang Online(部分题解)
- 2017 ACM/ICPC Asia Regional Shenyang Online//number number number
- HDU-2017 ACM/ICPC Asia Regional Shenyang Online-1005-number number number
- 2017 ACM/ICPC Asia Regional Shenyang Online 1005 number number number(矩阵快速幂)
- 【2017 ACM/ICPC Asia Regional Shenyang Online 1002】hdu 6195 cable cable cable
- 2017 ACM/ICPC Asia Regional Shenyang Online【solved:7 / 12】
- HDU-2017 ACM/ICPC Asia Regional Shenyang Online-1008-transaction transaction transaction
- Problem 1004-2017 ACM/ICPC Asia Regional Shenyang Online
- [尺取法]2017 ACM/ICPC Asia Regional Shenyang Online 1012
- Problem 1002 cable cable cable-2017 ACM/ICPC Asia Regional Shenyang Online
- HDU-2017 ACM/ICPC Asia Regional Shenyang Online-1012-card card card
- 2017 ACM/ICPC Asia Regional Shenyang Online总结 5/11
- 2017 ACM/ICPC Asia Regional Shenyang Online cable cable cable
- HDU 6203 ping ping ping (LCA + 树状数组, 2017 ACM/ICPC Asia Regional Shenyang Online)
- HDU-2017 ACM/ICPC Asia Regional Shenyang Online-1002-cable cable cable
- HDU - 6205 card card card (贪心)2017 ACM/ICPC Asia Regional Shenyang Online
- 2017 ACM/ICPC Asia Regional Shenyang Online B