1. 程式人生 > >ping(NOIP模擬賽Round 4)第一次程序Rank 1!撒花慶祝!~(≧▽≦)/~

ping(NOIP模擬賽Round 4)第一次程序Rank 1!撒花慶祝!~(≧▽≦)/~

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> 
using
namespace 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!撒花慶祝!~\(≧▽≦)/~