传送门
洛谷上的翻译非常**,我看了半天中文翻译都没有看懂题目,最后还是靠Google翻译看懂了。一开始不知道会交易(雾)多次,还以为就输入一次PIN,还很奇怪为什么要分成那么多组输入。。

看懂了之后发现题目还是挺水的,直接暴力枚举PIN码,然后与输入比对。 f [ i ] [ j ] [ k ] 表示第 i 个动作的第 j 位向后的最近一个数字 k 的位置,可以递推在 O ( t [ i ] ) 的时间求出。这样就可以 O ( 1 ) 比对啦~

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int N=1001;
int n,t[N],f[N][N*10][10],a[N][N*10],ans;

void read(int &x){
    char ch=getchar();x=0;
    for(;ch<'0'||ch>'9';ch=getchar());
    for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
}

int main(){
    read(n);
    for(int i=1;i<=n;i++){
        read(t[i]);
        char ch;
        for(int j=1;j<=t[i];ch=getchar(),a[i][j]=ch-'0',j++);
    }
    for(int i=1;i<=n;i++)        //递推
     for(int j=t[i];j;j--)
      for(int k=0;k<=9;k++)
       if (a[i][j]==k) f[i][j][k]=j;
        else f[i][j][k]=f[i][j+1][k];
    for(int q=0;q<=9;q++)        //枚举
     for(int w=0;w<=9;w++)
      for(int e=0;e<=9;e++)
       for(int r=0;r<=9;r++){
            int b=1;
            for(int i=1;i<=n;i++)
             if (!f[i][f[i][f[i][f[i][1][q]][w]][e]][r]) b=0;   //判断 我代码真是越写越**的说
            if (b) ans++;
       }
    cout<<ans;
    return 0;
}

然后,这份代码跑得特别慢,洛谷上大概三十几份评测吧,我倒数第二QAQ
看了别人的代码后..我…无**说….

溜了溜了