Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define M1 1000000007
- #define M 2038074743
- long long int a[100005],d[100005],dp[100005];
- int main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- long long int n,m,x=0,y=0,z,k=0,i,j=0,l,ans=0,q=1,r=1,t,ca;
- cin>>t;
- ca=t;
- while(t--)
- {
- unordered_map< int,int>ma;
- vector<int>v;
- cin>>n;
- string s,p;
- for(i=0;i<n;i++)
- {
- cin>>p;
- y=p.size();
- v.push_back(y);
- x=0,y=0;
- for(j=0;j<p.size();j++)
- {
- x=(x*401+p[j])%M;
- //y=(y*409+p[j])%M1;
- }
- ma[x]=1;
- }
- cin>>s;
- m=s.size();
- x=0,y=0;
- for(i=0;i<m;i++)
- {
- dp[i]=1e7;
- x=(x*401+s[i])%M;
- //y=(y*409+s[i])%M1;
- // e[i]=y;
- a[i]=x;
- if(i==0)d[i]=1;
- else d[i]=(d[i-1]*401)%M;
- }
- dp[m]=1e7;
- auto ip = std::unique(v.begin(), v.end());
- v.resize(std::distance(v.begin(), ip));
- sort(v.begin(),v.end());
- dp[0]=0;
- for(i=0;i<m;i++)
- {
- for(j=0;j<v.size();j++)
- {
- z=v[j];
- // cout<<z<<" "<<i<<endl;
- if(i+z>m)break;
- if(i==0)
- {
- x=a[z-1];
- // y=e[z-1];
- }
- else
- {
- x=(a[i+z-1]-a[i-1]*d[z])%M;
- x=(x+M)%M;
- //y=(e[i+z-1]-e[i-1]*f[z])%M1;
- // y=(y+M1)%M1;
- }
- if(ma[x])
- {
- dp[i+z]=min(dp[i+z],dp[i]+1);
- }
- // cout<<x<<" "<<y<<" "<<i<<endl;
- }
- }
- //cout<<dp[0]<<" "<<dp[1]<<" "<<dp[2]<<" "<<dp[3]<<endl;
- cout<<"Case "<<ca-t<<": ";
- if(dp[m]==1e7)cout<<"impossible"<<endl;
- else cout<<dp[m]<<endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment