Programiranje 方法记录( 二 )


#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N=50005;int pre[N][30];char s[N];int q,len;int main(){ scanf("%s",s+1); len=strlen(s+1); for(int i=1;i<=len;i++) {for(int j=1;j<=26;j++) pre[i][j]+=pre[i-1][j];//分别记录每种字母出现次数的前缀和pre[i][s[i]-'a'+1]++;//当前位对应字母累加 } scanf("%d",&q); while(q--) {int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);if(b-a!=d-c)//如果两个单词的长度不相等,就肯定NE{puts("NE");continue;}bool flag=1;for(int i=1;i<=26;i++){int tmp1=pre[b][i]-pre[a-1][i];//a~b第i个字母出现次数int tmp2=pre[d][i]-pre[c-1][i];//c~d第i个字母出现次数if(tmp1!=tmp2)//若某个字母出现次数不相等,则直接判NE{flag=0;break;}}if(flag) puts("DA");else puts("NE"); } return 0;}

经验总结扩展阅读