DP+bitset
HDU5716
dp[i][j] = dp[i-1][j-1] && (s[i] in set[j]); 第二维压bitset
1 #include <bits/stdc++.h> 2 #define X first 3 #define Y second 4 #define mp make_pair 5 #define pii pair<int, int> 6 #define gg puts("gg"); 7 using namespace std; 8 const int N = 2e6+5; 9 int id(char c){ 10 if(c >= '0'&& c <= '9') return c-'0'; 11 if(c >= 'a'&& c <= 'z') return c-'a'+10; 12 if(c >= 'A'&& c <= 'Z') return c-'A'+36; 13 return -1; 14 } 15 char s[N], t[70]; 16 bitset<505> se[70], dp; 17 int main(){ 18 while(gets(s+1)){ 19 for(int i = 0; i < 70; i++) se[i].reset(); 20 dp.reset(); 21 int m, n; scanf("%d", &n); 22 for(int i = 1; i <= n; i++){ 23 scanf("%d", &m); 24 scanf(" %s", t); 25 for(int j = 0; t[j]; j++) 26 se[ id(t[j]) ].set(i); 27 } 28 dp.set(0); 29 bool tag = true; 30 for(int i = 1; s[i]; i++){ 31 if(id(s[i]) >= 0) 32 dp = (dp<<1)&se[ id(s[i]) ]; 33 else 34 dp.reset(); 35 dp.set(0); 36 if(dp.test(n)) 37 tag = false, printf("%d\n", i-n+1); 38 } 39 if(tag) puts("NULL"); 40 getchar(); 41 } 42 return 0; 43 }