题目如下:
(输出描述貌似错了......我不到啊)
很简单,只需要找的时候再额外加上一个数据来表示它们组成“NOI”时的位置然后检测一下找到的情况有没有被记录,如果没有就记录就记录,然后次数++;如果有了就跳过接着找
一开始我想到用数组记录,一维数组,值通过计算得到,比如NOI三个数,N位置下标乘一百,O位置下标乘十,I下标不处理然后加到一起。但是这样一来就会导致漏算,比如N下标为2,O下标为5,I下标为3,就是253,但是N下标为1,O下标为13,I下标为23,也是253
怎么说呢,然后就想到可以用结构体
struct NOI_list{
int one;
int two;
int thr;
}lists[2333];
这样就唯一了
最后代码如下,可能相对很复杂(菜就多练)
#include<bits/stdc++.h>
using namespace std;
struct NOI_list{
int one;
int two;
int thr;
}lists[2333];
//每种NOI的组合
int N,s;
string A;
int main(){
cin>>N;
cin>>A;
for(int i=0;i<N;i++){
if(A[i]=='N'){
for(int j=i+1;j<N;j++){
if(A[j]=='O'){
for(int k=j+1;k<N;k++){
if(A[k]=='I'){
int o=0;
for(int l=0;lists[l].one!=0&&lists[l].thr!=0&&lists[l].two!=0;l++){
if(lists[l].one==i+1&&lists[l].two==j+1&&lists[l].thr==k+1){//已经算过了
o++;
}
}
s++;
lists[o].one=i+1;
lists[o].two=j+1;
lists[o].thr=k+1;
}
}
}
}
}
}
cout<<s;
return 0;
}
用了四重循环......
算了,至少提交了是AC,但是还是要加以优化