朴实无华前缀和+计数
2024-07-06 17:49:27
发布于:上海
31阅读
0回复
0点赞
前排提醒:
本代码使用二维数组,空间复杂度高,但时间复杂度尚可 不信的话看提交记录,别的大几百ms我的40ms
本代码比较易懂,适合初学者(?)
正文:
#include<iostream>
using namespace std;
int main()
{
string s;
int q,aa,bb,cc,dd,b[50002][123]={},x[123]={},y[123]={};
bool f;
cin>>s>>q;
for(int i=0;i<s.length();i++)//遍历字符串s
{
for(int j=97;j<=122;j++)
{
b[i+1][j]=b[i][j];//前缀和数组b,第i+1个先继承第i个的数据
}
b[i+1][s[i]]++;//然后计数,s当前遍历到的字符对应的索引位置+1
}
for(int i=1;i<=q;i++)
{
cin>>aa>>bb>>cc>>dd;//四个操作数
f=1;
for(int j=97;j<=122;j++)//这个循环中,使数组x保存第aa到第bb的位置间各字符出现次数,y保存cc到dd(是利用前缀和求和)
{
x[j]=b[bb][j]-b[aa-1][j];
y[j]=b[dd][j]-b[cc-1][j];
if(x[j]!=y[j])//如果两个数组中某个字符的个数不同,就说明选定的字符区间无法通过打乱顺序组成对方,把标志变量设为false
{
f=0;
break;
}
}
if(f)//输出要求
{
cout<<"DA"<<endl;
}
else
{
cout<<"NE"<<endl;
}
}
return 0;
}
这里空空如也
有帮助,赞一个