专栏文章

CF1902

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mir2xbcr
此快照首次捕获于
2025/12/04 14:53
3 个月前
此快照最后确认于
2025/12/04 14:53
3 个月前
查看原文
D
CPP
using namespace std;
int sumx[200005];
int sumy[200005];
char a[200005];
map<pair<int,int>, vector<int> > m;
int main()
{
#ifdef absi2011
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
int n,q;
scanf("%d%d",&n,&q);
scanf("%s",a);
int i;
m[make_pair(0,0)].push_back(0);
for (i=0;i<n;i++)
{
sumx[i+1] = sumx[i];
sumy[i+1] = sumy[i];
if (a[i] == 'L')
{
sumx[i+1] --;
}
else if (a[i] == 'R')
{
sumx[i+1] ++;
}
else if (a[i] == 'U')
{
sumy[i+1] ++;
}
else if (a[i] == 'D')
{
sumy[i+1] --;
}
m[make_pair(sumx[i+1], sumy[i+1])].push_back(i+1);
}
for (i=0;i<q;i++)
{
int x,y,l,r;
scanf("%d%d%d%d",&x,&y,&l,&r);
pair<int,int> p = make_pair(x,y);
l--;
if (m.find(p) != m.end())
{
if ((m[p][0] <= l) || (m[p][m[p].size()-1] > r))
{
puts("YES");
continue;
}
}
x -= sumx[l];
y -= sumy[l];
int tx = sumx[r] - sumx[l];
int ty = sumy[r] - sumy[l];
p = make_pair(tx - x + sumx[l], ty - y + sumy[l]);
if (m.find(p) != m.end())
{
vector<int>::iterator ii =
lower_bound(m[p].begin(),m[p].end(),l);
if ((ii != m[p].end()) && ((*ii) <= r))
{
puts("YES");
continue;
}
}
puts("NO");
}
return 0;
}
E
CPP
using namespace std;
string a[1000005];
string b[1000005];
long long ans = 0;
void dfs(int l1,int r1,int l2,int r2,int x = 0)
{
if ((l1 == r1) || (l2 == r2))
{
return;
}
char i;
for (i='a';i<='z';i++)
{
int pre_l1 = l1;
for (;l1 < r1; l1++)
{
if ((int)a[l1].length() == x)
{
pre_l1 = l1 + 1;
continue;
}
if (a[l1][x] != i)
{
break;
}
}
int pre_l2 = l2;
for (;l2 < r2; l2++)
{
if ((int)b[l2].length() == x)
{
pre_l2 = l2 + 1;
continue;
}
if (b[l2][x] != i)
{
break;
}
}
ans -= (long long)(l1 - pre_l1) * (l2 - pre_l2) * 2;
dfs(pre_l1, l1, pre_l2, l2, x+1);
}
}
int main()
{
#ifdef absi2011
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
int n;
scanf("%d",&n);
static char c[1000005];
int i;
int sum_n = 0;
for (i=0;i<n;i++)
{
scanf("%s",c);
a[i] = c;
b[i] = a[i];
reverse(b[i].begin(),b[i].end());
sum_n += a[i].length();
}
sort(a,a+n);
sort(b,b+n);
ans = (long long)sum_n * n * 2;
dfs(0,n,0,n);
printf("%lld\n",ans);
return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...