题目:

ping(NOIP模拟赛Round 4)第一次程序Rank 1!撒花庆祝!~\(≧▽≦)/~-LMLPHP

恩,就是裸的字符串处理啦。

连标程都打的是暴力(随机数据太水啦!吐槽。)

本来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[][];
int iter[],total=;
char computer[][];
bool openq[];
int ans=;
int q;
int main(){
//freopen("ping.in","r",stdin);
//freopen("ping.out","w",stdout);
scanf("%d",&q);
for(int i=;i<=q;i++)
{
char mingling[];
scanf("%s",mingling);
if(mingling[]=='S')
{
char qaq[];
scanf("%s",qaq);
int find;
int changdu=strlen(qaq);
for(int j=;j<=iter[changdu];j++)
{
bool cunzai=true;
for(int k=;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[]=='O')
{
char qaq[];
scanf("%s",qaq);
int find;
bool cunzai=false;
int changdu=strlen(qaq);
for(int j=;j<=iter[changdu];j++)
{
cunzai=true;
for(int k=;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=;j<changdu;j++)
computer[total][j]=qaq[j];
sum[changdu][++iter[changdu]]=total;
openq[total]=true;
}
else openq[find]=true;
}
else if(mingling[]=='P')
{
char qaq[];
scanf("%s",qaq);
int changdu=strlen(qaq);
for(int j=;j<=iter[changdu];j++)
{
if(!openq[sum[changdu][j]])continue;
bool cunzai=true;
for(int k=;k<changdu;k++)
{
if(computer[sum[changdu][j]][k]!=qaq[k]&&qaq[k]!='?'){cunzai=false;break;}
}
if(cunzai)ans++;
}
printf("%d\n",ans);
ans=;
}
}
return ;
//fclose(stdin);
//fclose(stdout);
}
05-23 07:23