标签:
我们有一个字符串集合S,其中有N个两两不同的字符串。
还有M个询问,每个询问给出一个字符串w,求有多少S中的字符串可以由w添加恰好一个字母得到。
字母可以添加在包括开头结尾在内的任意位置,比如在"abc"中添加"x",就可能得到"xabc", "axbc", "abxc", "abcx".这4种串。
第一行两个数N和M,表示集合S中字符串的数量和询问的数量。
接下来N行,其中第i行给出S中第i个字符串。
接下来M行,其中第i行给出第i个询问串。
所有字符串只由小写字母构成。
数据范围:
N,M<=10000。
S中字符串长度和<=100000。
所有询问中字符串长度和<=100000。
对每个询问输出一个数表示答案。
3 3 tourist petr rng toosimple rg ptr
0 1 1
暴力查找就可以
#include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <set> #include <string> #include <queue> #include <stack> #include <bitset> using namespace std; #define pb(x) push_back(x) #define ll long long #define mk(x, y) make_pair(x, y) #define lson l, m, rt<<1 #define mem(a) memset(a, 0, sizeof(a)) #define rson m+1, r, rt<<1|1 #define mem1(a) memset(a, -1, sizeof(a)) #define mem2(a) memset(a, 0x3f, sizeof(a)) #define rep(i, n, a) for(int i = a; i<n; i++) #define fi first #define se second typedef pair<int, int> pll; const double PI = acos(-1.0); const double eps = 1e-8; const int mod = 1e9+7; const int inf = 1061109567; const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; string s[10005], str; int len[10005]; int main() { ios::sync_with_stdio(0); int n, m; cin>>n>>m; for(int i = 0; i<n; i++) { cin>>s[i]; len[i] = s[i].size(); } for(int i = 0; i<m; i++) { cin>>str; int sz = str.size(), cnt = 0; for(int j = 0; j<n; j++) { if(sz+1!=len[j]) continue; int flag = 0, pos = 0, k = 0, sign = 0; while(pos<sz) { if(k>sz||str[pos]!=s[j][k]) { if(flag) { sign = 1; break; } else { flag = 1; pos--; } } pos++, k++; } if(!sign) { cnt++; } } cout<<cnt<<endl; } return 0; }
hihocoder #1260 : String Problem I
标签:
原文地址:http://www.cnblogs.com/yohaha/p/5083729.html