萌新求助传智杯I题
查看原帖
萌新求助传智杯I题
479532
InterN_NOT_FOUND楼主2022/3/12 18:38

rt,#1TLE,求助如何优化


#include<bits/stdc++.h>
#define int long long

namespace IO{
	inline bool isnum(char ch){return ch>='0'&&ch<='9';}
	inline int read()
	{
		int x=0,f=1;char ch=getchar();
		while (!isnum(ch)){if (ch=='-') f=-1;ch=getchar();}
		while (isnum(ch)){x=x*10+ch-48;ch=getchar();}
		return x*f;
	}
	inline void out(int x,char ch){
	    if(x<0){putchar('-');x=-x;}
	    if(x>9)out(x/10,'/');
	    putchar(x%10+'0');
	    if(ch=='l')putchar('\n');
	    if(ch=='s')putchar(' ');
	}
}
using namespace std;
using namespace IO;

inline int slen(string s){return s.size();}
string s1[100001],s2[100001];
int nxt[100001],n[100001],m[100001], a = read(), b = read(), q = read();
signed main()
{
	for(int i = 1; i <= a; ++i) {
		cin >> s2[i];
		m[i] = slen(s2[i]);
		s2[i] = s2[i].insert(0, "*");
	}
	for(int i = 1; i <= b; ++i) {
		cin >> s1[i];
		n[i] = slen(s1[i]);
		s1[i] = s1[i].insert(0, "*");
	}
	while(q--){
		int j, ans = 0, x = read(), y = read();
		bool flag1;
		for (int k = 1; k <= a; ++k) {
			j = 0; nxt[0] = nxt[1] = 0; flag1 = 0;
			for(register int i=2;i<=m[k];i++){
				while(j>0&&s2[k][j+1]!=s2[k][i])j=nxt[j];
				if(s2[k][j+1]==s2[k][i])j++;
				nxt[i]=j;
			}
			j = 0;
			for(int i=1;i<=n[x];i++){
				while(j>0&&s2[k][j+1]!=s1[x][i])j=nxt[j];
				if(s2[k][j+1]==s1[x][i])j++;
				if(j==m[k]){
					flag1 = 1;
					break;
				}
			}
			if(flag1) {
				j = 0;
				for(int i=1;i<=n[y];i++){
					while(j>0&&s2[k][j+1]!=s1[y][i])j=nxt[j];
					if(s2[k][j+1]==s1[y][i])j++;
					if(j==m[k]){
						++ans;
						break;
					}
				}
			}
		}
		out(ans ,'l');
	}
	return 0;
}

2022/3/12 18:38
加载中...