10.11
ZOJ Monthly。
ZOJ 3903 Ant
推公式。
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 typedef long long LL; 5 const LL mod=1e9+7; 6 const LL re=83333334LL; 7 LL n[4]; 8 9 int main(void) 10 { 11 int T; cin>>T; 12 while(T--) 13 { 14 scanf("%lld",&n[0]); 15 n[0]%=mod; 16 for(int i=1;i<4;i++) n[i]=(n[i-1]*n[0])%mod; 17 LL ans=13*n[3]%mod+26*n[2]%mod+17*n[1]%mod+4*n[0]%mod; 18 ans=(ans%mod*re%mod+mod)%mod; 19 printf("%lld\n",ans); 20 } 21 return 0; 22 }
ZOJ 3905 Cake
按b排序后。考虑按b降序每次加上一对物品。
这两件物品中第二件是当前所有物品中b最小的。必取。
第一件物品如果和前面的物品放在一组。就必取。
如果和第二件物品放一起。就不取。
所以比较第一件物品与前面已取物品中的最小值。取a大的一件即可。
已取物品的最小值用优先队列维护。
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <queue> 5 using namespace std; 6 priority_queue<int> q; 7 8 struct node 9 { 10 int a,b; 11 }p[1000]; 12 13 bool cmp(node x,node y) 14 { 15 return x.b>y.b; 16 } 17 18 int main(void) 19 { 20 int T; cin>>T; 21 while(T--) 22 { 23 int n; scanf("%d",&n); 24 for(int i=0;i<n;i++) scanf("%d%d",&p[i].a,&p[i].b); 25 sort(p,p+n,cmp); 26 while(!q.empty()) q.pop(); 27 int ans=p[1].a; 28 q.push(-p[1].a); 29 for(int i=2;i<n;i+=2) 30 { 31 int cur=-q.top(); 32 if(p[i].a>cur) 33 { 34 q.pop(); 35 q.push(-p[i].a); 36 ans+=p[i].a-cur; 37 } 38 ans+=p[i+1].a; 39 q.push(-p[i+1].a); 40 } 41 printf("%d\n",ans); 42 } 43 return 0; 44 }
ZOJ 3914 Semantic Version
题意:给两个版本号。判断第一个是否小于第二个。
比较版本号的规则如下。
一。X.Y.Z小的在先。
二。相同X.Y.Z的预发布版本(即-blabla形式)先于非预发布版本。
三。同为预发布版本。比较后面用 . 隔开的每一段直至出现不相同为止。
比较每一段时有三种情况 1.纯数字 2.字符 3.没有了
i)没有 先于 纯数字 先于 字符
ii)纯数字 数值小的在先
iii)字符 字典序小的在先
写个结构体。重载<比较即可。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 struct p 8 { 9 bool num; 10 int n; 11 char s[30]; 12 }; 13 14 struct node 15 { 16 int x,y,z; 17 int sz; 18 p suf[30]; 19 node(){x=y=z=sz=0;memset(suf,0,sizeof(suf));} 20 friend bool operator < (node A,node B) 21 { 22 if(A.x!=B.x) return A.x<B.x; 23 if(A.y!=B.y) return A.y<B.y; 24 if(A.z!=B.z) return A.z<B.z; 25 if(A.sz==0||B.sz==0) return A.sz>B.sz; 26 int sz=max(A.sz,B.sz); 27 for(int i=0;i<=sz;i++) 28 { 29 if(i==A.sz||i==B.sz) return A.sz<B.sz; 30 if(A.suf[i].num) 31 { 32 if(B.suf[i].num&&A.suf[i].n!=B.suf[i].n) return A.suf[i].n<B.suf[i].n; 33 if(!B.suf[i].num) return true; 34 } 35 else 36 { 37 if(B.suf[i].num) return false; 38 else 39 { 40 int tmp=strcmp(A.suf[i].s,B.suf[i].s); 41 if(tmp) return tmp<0; 42 } 43 } 44 } 45 } 46 }; 47 48 bool is_num(char c) 49 { 50 return c>='0'&&c<='9'; 51 } 52 53 void get(node & A,char * a) 54 { 55 int pos=1,cnt=0,ok=1; 56 for(int i=0;i<strlen(a);i++) 57 { 58 if(pos<4) 59 { 60 if(a[i]=='-') {pos++;continue;} 61 if(a[i]=='.') pos++; 62 else 63 { 64 if(pos==1) A.x=A.x*10+a[i]-'0'; 65 else if(pos==2) A.y=A.y*10+a[i]-'0'; 66 else A.z=A.z*10+a[i]-'0'; 67 } 68 } 69 else 70 { 71 if(i==strlen(a)-1||a[i]=='.') 72 { 73 if(i==strlen(a)-1) 74 { 75 A.suf[A.sz].s[cnt++]=a[i]; 76 if(!is_num(a[i])) ok=0; 77 } 78 A.suf[A.sz].s[cnt]=0; 79 if(ok) 80 { 81 for(int j=0;j<strlen(A.suf[A.sz].s);j++) 82 A.suf[A.sz].n=A.suf[A.sz].n*10+A.suf[A.sz].s[j]-'0'; 83 A.suf[A.sz].num=1; 84 } 85 cnt=0; ok=1; 86 A.sz++; 87 } 88 else 89 { 90 A.suf[A.sz].s[cnt++]=a[i]; 91 if(!is_num(a[i])) ok=0; 92 } 93 } 94 } 95 } 96 97 int main(void) 98 { 99 char a[50],b[50]; 100 while(~scanf("%s%s",a,b)) 101 { 102 node A,B; 103 get(A,a); 104 get(B,b); 105 if(A<B) puts("Wow! Such feature! Very smart! I'm excited!"); 106 else puts("I'm angry!"); 107 } 108 return 0; 109 }
10.12
什么都没干。
10.13
CF 585B Phillip and Trains
dfs写矬T了。改BFS标记下过。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 using namespace std; 7 typedef pair<int,int> pii; 8 bool ok,vis[4][200]; 9 char G[4][200]; 10 int n,m,k; 11 queue<pii> q; 12 13 bool f(int x,int y) 14 { 15 return y>=m||G[x][y]=='.'; 16 } 17 18 int main(void) 19 { 20 int T; cin>>T; 21 while(T--) 22 { 23 scanf("%d%d",&n,&k); 24 int s; 25 memset(G,0,sizeof(G)); 26 memset(vis,0,sizeof(vis)); 27 for(int i=1;i<=3;i++) 28 { 29 scanf("%s",G[i]); 30 if(G[i][0]=='s') s=i; 31 } 32 m=strlen(G[1]); ok=0; 33 while(!q.empty()) q.pop(); 34 q.push(pii(s,0)); 35 while(!q.empty()) 36 { 37 pii tem=q.front(); q.pop(); 38 int x=tem.first,y=tem.second+1; 39 if(y>=m) {ok=1;break;} 40 if(G[x][y]!='.') continue; 41 if(x>1&&f(x-1,y)&&f(x-1,y+1)&&f(x-1,y+2)&&!vis[x-1][y+2]) 42 q.push(pii(x-1,y+2)),vis[x-1][y+2]=1; 43 if(x<3&&f(x+1,y)&&f(x+1,y+1)&&f(x+1,y+2)&&!vis[x+1][y+2]) 44 q.push(pii(x+1,y+2)),vis[x+1][y+2]=1; 45 if(f(x,y+1)&&f(x,y+2)&&!vis[x][y+2]) 46 q.push(pii(x,y+2)),vis[x][y+2]=1; 47 } 48 puts(ok?"YES":"NO"); 49 } 50 return 0; 51 }
10.14
HDU 2222 Keywords Search
AC自动机。终于有板了?
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 using namespace std; 7 const int maxnode=5e5+10,sigma_size=26; 8 const int maxn=1e6+10; 9 char a[maxn]; 10 11 struct Ac_auto 12 { 13 int Next[maxnode][sigma_size]; 14 int val[maxnode]; 15 int fail[maxnode]; 16 int sz; 17 Ac_auto(){sz=1;memset(Next[0],0,sizeof(Next[0]));} 18 void init(){sz=1;memset(Next[0],0,sizeof(Next[0]));} 19 int idx(char c) {return c-'a';} 20 21 void insert(char *s) 22 { 23 int u=0,n=strlen(s); 24 for(int i=0;i<n;i++) 25 { 26 int c=idx(s[i]); 27 if(!Next[u][c]) 28 { 29 memset(Next[sz],0,sizeof(Next[sz])); 30 val[sz]=0; 31 Next[u][c]=sz++; 32 } 33 u=Next[u][c]; 34 } 35 val[u]++; 36 } 37 38 void build() 39 { 40 queue<int> q; 41 fail[0]=0; 42 for(int i=0;i<sigma_size;i++) if(Next[0][i]) 43 { 44 fail[Next[0][i]]=0; 45 q.push(Next[0][i]); 46 } 47 while(!q.empty()) 48 { 49 int pos=q.front(); q.pop(); 50 for(int i=0;i<sigma_size;i++) 51 { 52 if(!Next[pos][i]) Next[pos][i]=Next[fail[pos]][i]; 53 else 54 { 55 fail[Next[pos][i]]=Next[fail[pos]][i]; 56 q.push(Next[pos][i]); 57 } 58 } 59 } 60 } 61 62 int query(char * s) 63 { 64 int len=strlen(s); 65 int pos=0,ret=0; 66 for(int i=0;i<len;i++) 67 { 68 pos=Next[pos][idx(s[i])]; 69 int tmp=pos; 70 while(tmp) 71 { 72 ret+=val[tmp]; 73 val[tmp]=0; 74 tmp=fail[tmp]; 75 } 76 } 77 return ret; 78 } 79 80 }ACA; 81 82 int main(void) 83 { 84 int T; cin>>T; 85 while(T--) 86 { 87 ACA.init(); 88 int N; scanf("%d",&N); 89 for(int i=0;i<N;i++) 90 { 91 char m[100]; 92 scanf("%s",m); 93 ACA.insert(m); 94 } 95 ACA.build(); 96 scanf("%s",a); 97 printf("%d\n",ACA.query(a)); 98 } 99 return 0; 100 }
HDU 2896 病毒侵袭
板子应该能用?
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <vector> 6 #include <queue> 7 using namespace std; 8 const int maxnode=1e5+10,sigma_size=128; 9 const int maxn=1e4+10; 10 vector<int> ans; 11 char a[maxn]; 12 13 struct Ac_auto 14 { 15 int Next[maxnode][sigma_size]; 16 int val[maxnode]; 17 int fail[maxnode]; 18 int sz; 19 Ac_auto(){sz=1;memset(Next[0],0,sizeof(Next[0]));} 20 void init(){sz=1;memset(Next[0],0,sizeof(Next[0]));} 21 int idx(char c) {return c;} 22 23 void insert(char *s,int v) 24 { 25 int u=0,n=strlen(s); 26 for(int i=0;i<n;i++) 27 { 28 int c=idx(s[i]); 29 if(!Next[u][c]) 30 { 31 memset(Next[sz],0,sizeof(Next[sz])); 32 val[sz]=0; 33 Next[u][c]=sz++; 34 } 35 u=Next[u][c]; 36 } 37 val[u]=v; 38 } 39 40 void build() 41 { 42 queue<int> q; 43 fail[0]=0; 44 for(int i=0;i<sigma_size;i++) if(Next[0][i]) 45 { 46 fail[Next[0][i]]=0; 47 q.push(Next[0][i]); 48 } 49 while(!q.empty()) 50 { 51 int pos=q.front(); q.pop(); 52 for(int i=0;i<sigma_size;i++) 53 { 54 if(!Next[pos][i]) Next[pos][i]=Next[fail[pos]][i]; 55 else 56 { 57 fail[Next[pos][i]]=Next[fail[pos]][i]; 58 q.push(Next[pos][i]); 59 } 60 } 61 } 62 } 63 64 void query(char * s) 65 { 66 int len=strlen(s); 67 int pos=0; 68 ans.clear(); 69 for(int i=0;i<len;i++) 70 { 71 pos=Next[pos][idx(s[i])]; 72 int tmp=pos; 73 while(tmp) 74 { 75 if(val[tmp]) ans.push_back(val[tmp]); 76 tmp=fail[tmp]; 77 } 78 } 79 sort(ans.begin(),ans.end()); 80 } 81 82 }ACA; 83 84 int main(void) 85 { 86 int N; 87 while(~scanf("%d",&N)) 88 { 89 ACA.init(); 90 for(int i=1;i<=N;i++) 91 { 92 scanf("%s",a); 93 ACA.insert(a,i); 94 } 95 ACA.build(); 96 int M; scanf("%d",&M); 97 int tot=0; 98 for(int i=1;i<=M;i++) 99 { 100 scanf("%s",a); 101 ACA.query(a); 102 if(ans.size()) 103 { 104 printf("web %d:",i); 105 for(int j=0;j<ans.size();j++) printf(" %d",ans[j]); 106 puts(""); 107 tot++; 108 } 109 } 110 printf("total: %d\n",tot); 111 } 112 return 0; 113 }
HDU 3065 病毒侵袭持续中
应该没有问题吧。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 using namespace std; 7 const int maxnode=1e5+10,sigma_size=128; 8 const int maxn=2e6+10; 9 char a[1001][100],b[maxn]; 10 int cnt[1001]; 11 12 struct Ac_auto 13 { 14 int Next[maxnode][sigma_size]; 15 int val[maxnode]; 16 int fail[maxnode]; 17 int sz; 18 Ac_auto(){sz=1;memset(Next[0],0,sizeof(Next[0]));} 19 void init(){sz=1;memset(Next[0],0,sizeof(Next[0]));} 20 int idx(char c) {return c;} 21 22 void insert(char *s,int v) 23 { 24 int u=0,n=strlen(s); 25 for(int i=0;i<n;i++) 26 { 27 int c=idx(s[i]); 28 if(!Next[u][c]) 29 { 30 memset(Next[sz],0,sizeof(Next[sz])); 31 val[sz]=0; 32 Next[u][c]=sz++; 33 } 34 u=Next[u][c]; 35 } 36 val[u]=v; 37 } 38 39 void build() 40 { 41 queue<int> q; 42 fail[0]=0; 43 for(int i=0;i<sigma_size;i++) if(Next[0][i]) 44 { 45 fail[Next[0][i]]=0; 46 q.push(Next[0][i]); 47 } 48 while(!q.empty()) 49 { 50 int pos=q.front(); q.pop(); 51 for(int i=0;i<sigma_size;i++) 52 { 53 if(!Next[pos][i]) Next[pos][i]=Next[fail[pos]][i]; 54 else 55 { 56 fail[Next[pos][i]]=Next[fail[pos]][i]; 57 q.push(Next[pos][i]); 58 } 59 } 60 } 61 } 62 63 void query(char * s) 64 { 65 int len=strlen(s); 66 int pos=0; 67 for(int i=0;i<len;i++) 68 { 69 pos=Next[pos][idx(s[i])]; 70 int tmp=pos; 71 while(tmp) 72 { 73 if(val[tmp]) cnt[val[tmp]]++; 74 tmp=fail[tmp]; 75 } 76 } 77 } 78 79 }ACA; 80 81 int main(void) 82 { 83 int N; 84 while(~scanf("%d",&N)) 85 { 86 ACA.init(); 87 for(int i=1;i<=N;i++) 88 { 89 scanf("%s",a[i]); 90 ACA.insert(a[i],i); 91 } 92 ACA.build(); 93 memset(cnt,0,sizeof(cnt)); 94 scanf("%s",b); 95 ACA.query(b); 96 for(int i=1;i<=N;i++) if(cnt[i]) printf("%s: %d\n",a[i],cnt[i]); 97 } 98 return 0; 99 }
10.15
HDU 3695 Computer Virus on Planet Pandora
我可以不服吗- -。
明明是个板题样。一直T。加个used标记过了。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 using namespace std; 7 const int maxnode=3e5,sigma_size=26; 8 const int maxn=6e6; 9 char a[maxn]; 10 11 struct Ac_auto 12 { 13 int Next[maxnode][sigma_size]; 14 int val[maxnode]; 15 int fail[maxnode]; 16 bool used[maxnode]; 17 int sz; 18 Ac_auto(){sz=1;memset(Next[0],0,sizeof(Next[0]));} 19 void init(){sz=1;memset(Next[0],0,sizeof(Next[0]));} 20 int idx(char c) {return c-'A';} 21 22 void insert(char *s) 23 { 24 int u=0,n=strlen(s); 25 for(int i=0;i<n;i++) 26 { 27 int c=idx(s[i]); 28 if(!Next[u][c]) 29 { 30 memset(Next[sz],0,sizeof(Next[sz])); 31 val[sz]=used[sz]=0; 32 Next[u][c]=sz++; 33 } 34 u=Next[u][c]; 35 } 36 val[u]++; 37 } 38 39 void build() 40 { 41 queue<int> q; 42 fail[0]=0; 43 for(int i=0;i<sigma_size;i++) if(Next[0][i]) 44 { 45 fail[Next[0][i]]=0; 46 q.push(Next[0][i]); 47 } 48 while(!q.empty()) 49 { 50 int pos=q.front(); q.pop(); 51 for(int i=0;i<sigma_size;i++) 52 { 53 if(!Next[pos][i]) Next[pos][i]=Next[fail[pos]][i]; 54 else 55 { 56 fail[Next[pos][i]]=Next[fail[pos]][i]; 57 q.push(Next[pos][i]); 58 } 59 } 60 } 61 } 62 63 int query(char * s) 64 { 65 int len=strlen(s); 66 int pos=0,ret=0; 67 for(int i=0;i<len;i++) 68 { 69 pos=Next[pos][idx(s[i])]; 70 int tmp=pos; 71 while(tmp&&!used[tmp]) 72 { 73 used[tmp]=1; 74 if(val[tmp]) ret++; 75 val[tmp]=0; 76 tmp=fail[tmp]; 77 } 78 } 79 return ret; 80 } 81 82 }ACA; 83 84 int main(void) 85 { 86 int T; cin>>T; 87 while(T--) 88 { 89 ACA.init(); 90 int N; scanf("%d",&N); 91 for(int i=1;i<=N;i++) 92 { 93 scanf("%s",a); 94 ACA.insert(a); 95 } 96 ACA.build(); 97 char c; 98 int t=0; 99 getchar(); 100 while((c=getchar())!='\n') 101 { 102 if(c=='[') 103 { 104 int n; scanf("%d",&n); 105 c=getchar(); 106 while(n--) a[t++]=c; 107 getchar(); 108 } 109 else a[t++]=c; 110 } 111 a[t]=0; 112 int ans=ACA.query(a); 113 reverse(a,a+t); 114 ans+=ACA.query(a); 115 printf("%d\n",ans); 116 } 117 return 0; 118 }
10.16
CF 588B Duff in Love
真是有点数学就sb了。QAQ
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 typedef long long LL; 5 6 int main(void) 7 { 8 LL n,ans=1LL; 9 scanf("%I64d",&n); 10 for(LL i=2;i*i<=n;i++) 11 { 12 if(n%i==0) 13 { 14 ans*=i; 15 while(n%i==0) n/=i; 16 } 17 } 18 ans*=n; 19 printf("%I64d\n",ans); 20 return 0; 21 }
10.17
打个BC。
fst2题。