QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#368812#8339. Rooted Treenone#WA 0ms44864kbC++173.6kb2024-03-27 16:45:552024-03-27 16:46:13

Judging History

你现在查看的是最新测评结果

  • [2024-03-27 16:46:13]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:44864kb
  • [2024-03-27 16:45:55]
  • 提交

answer

#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[n]<<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;
} 

const int L = 6e4 + 5;
const int HASH_CNT = 2;

int hashBase[HASH_CNT] = {29, 31};
int hashMod[HASH_CNT] = {int(1e9 + 9), 998244353};

struct StringWithHash {
  char s[L];
  int ls;
  int hsh[HASH_CNT][L];
  int pwMod[HASH_CNT][L];

  void init() {  // 初始化
    ls = 0;
    for (int i = 0; i < HASH_CNT; ++i) {
      hsh[i][0] = 0;
      pwMod[i][0] = 1;
    }
  }

  StringWithHash() { init(); }

  void extend(char c) {
    s[++ls] = c;                          // 记录字符数和每一个字符
    for (int i = 0; i < HASH_CNT; ++i) {  // 双哈希的预处理
      pwMod[i][ls] =
          1ll * pwMod[i][ls - 1] * hashBase[i] % hashMod[i];  // 得到b^ls
      hsh[i][ls] = (1ll * hsh[i][ls - 1] * hashBase[i] + c) % hashMod[i];
    }
  }

  vector<int> getHash(int l, int r) {  // 得到哈希值 字符串从1开始计数
    vector<int> res(HASH_CNT, 0);
    for (int i = 0; i < HASH_CNT; ++i) {
      int t =
          (hsh[i][r] - 1ll * hsh[i][l - 1] * pwMod[i][r - l + 1]) % hashMod[i];
      t = (t + hashMod[i]) % hashMod[i];
      res[i] = t;
    }
    return res;
  }
};

bool equal(const vector<int> &h1, const vector<int> &h2) {
  assert(h1.size() == h2.size());
  for (unsigned i = 0; i < h1.size(); i++)
    if (h1[i] != h2[i]) return false;
  return true;
}

int n,q,m,k;
StringWithHash s[310],t;
int calc(int i) {
	int l=1,K=k;
	do{
		int L=l,R=m,ans=L-1;
		while(L<=R) {
			int M=L+R>>1;
			if(equal(t.getHash(L, M),s[i].getHash(L, M)) ) {
				ans=M,L=M+1;
			}else R=M-1;
		}
//		cout<<"|"<<ans<<'|'<<" ";
		if(ans==m) return 1;
		if(K==0) return 0;
		l=ans+2;
		if(l>m) return 1;
		--K;
	}while(1);
	return 0;
}
int main()
{
//	freopen("G.in","r",stdin);
//	freopen(".out","w",stdout);
	cin>>n>>q>>m>>k;
	For(i,n) {
		string st;cin>>st;
		Rep(j,m) s[i].extend(st[j]);
	}
	For(i,q) {
		string st;cin>>st;
		t.init();
		Rep(j,m) t.extend(st[j]);
		int ans=0;
		For(j,n) {
			int p=calc(j);
//			cout<<p;
			ans+=p;
			
		}
		cout<<ans<<endl;
	}
	
	
	return 0;
}



詳細信息

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 44864kb

input:

6 2

output:

6
6

result:

wrong answer 1st numbers differ - expected: '18', found: '6'