ping(NOIP模擬賽Round 4)第一次程序Rank 1!撒花慶祝!~(≧▽≦)/~
阿新 • • 發佈:2017-05-26
target 暴力 fin clas return ring freopen geo 是不是
原題傳送門
恩,就是裸的字符串處理啦。
連標程都打的是暴力(隨機數據太水啦!吐槽。)
本來O(n^2q)TLE好吧。、
然後我發明了一種神奇的算法,隨機數據跑的很快!,當然最壞復雜度跟標程一樣啦。
不過期望復雜度是O(nq)是不是很快
好吧說下我的做法,
我用computer數組儲存字符串,用iter[i]表示長度為i的字符串一共有幾個
sum[i][j]表示長度為i的第j個字符串。。
所以就像哈希一樣。。
第一次跑的比標程快!O(∩_∩)O~~
下面貼代碼
#include<iostream> #include<cstdio> #include<cstring> usingnamespace std; int sum[21][3001]; int iter[3001],total=0; char computer[3001][21]; bool openq[3001]; int ans=0; int q; int main(){ //freopen("ping.in","r",stdin); //freopen("ping.out","w",stdout); scanf("%d",&q); for(int i=1;i<=q;i++) { char mingling[4]; scanf("%s",mingling); if(mingling[0]==‘S‘) { char qaq[21]; scanf("%s",qaq); int find; int changdu=strlen(qaq); for(int j=1;j<=iter[changdu];j++) { bool cunzai=true;for(int k=0;k<changdu;k++) if(computer[sum[changdu][j]][k]!=qaq[k]){cunzai=false;break;} if(cunzai){find=sum[changdu][j];break;} } openq[find]=false; } else if(mingling[0]==‘O‘) { char qaq[21]; scanf("%s",qaq); int find; bool cunzai=false; int changdu=strlen(qaq); for(int j=1;j<=iter[changdu];j++) { cunzai=true; for(int k=0;k<changdu;k++) if(computer[sum[changdu][j]][k]!=qaq[k]){cunzai=false;break;} if(cunzai){find=sum[changdu][j];break;} } if(!cunzai){ total++; for(int j=0;j<changdu;j++) computer[total][j]=qaq[j]; sum[changdu][++iter[changdu]]=total; openq[total]=true; } else openq[find]=true; } else if(mingling[0]==‘P‘) { char qaq[21]; scanf("%s",qaq); int changdu=strlen(qaq); for(int j=1;j<=iter[changdu];j++) { if(!openq[sum[changdu][j]])continue; bool cunzai=true; for(int k=0;k<changdu;k++) { if(computer[sum[changdu][j]][k]!=qaq[k]&&qaq[k]!=‘?‘){cunzai=false;break;} } if(cunzai)ans++; } printf("%d\n",ans); ans=0; } } return 0; //fclose(stdin); //fclose(stdout); }
ping(NOIP模擬賽Round 4)第一次程序Rank 1!撒花慶祝!~\(≧▽≦)/~